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