]> git.karo-electronics.de Git - mdnsd.git/blob - sdtxt.c
Added netwatch to the Makefile
[mdnsd.git] / sdtxt.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "sdtxt.h"
4
5 // the universe is bound in equal parts by arrogance and altruism, any attempt to alter this would be suicide
6
7 int _sd2txt_len(const char *key, char *val)
8 {
9     int ret = strlen(key);
10     if(!*val) return ret;
11     ret += strlen(val);
12     ret++;
13     return ret;
14 }
15
16 void _sd2txt_count(xht h, const char *key, void *val, void *arg)
17 {
18     int *count = (int*)arg;
19     *count += _sd2txt_len(key,(char*)val) + 1;
20 }
21
22 void _sd2txt_write(xht h, const char *key, void *val, void *arg)
23 {
24     unsigned char **txtp = (unsigned char **)arg;
25     char *cval = (char*)val;
26
27     // copy in lengths, then strings
28     **txtp = _sd2txt_len(key,(char*)val);
29     (*txtp)++;
30     memcpy(*txtp,key,strlen(key));
31     *txtp += strlen(key);
32     if(!*cval) return;
33     **txtp = '=';
34     (*txtp)++;
35     memcpy(*txtp,cval,strlen(cval));
36     *txtp += strlen(cval);
37 }
38
39 unsigned char *sd2txt(xht h, int *len)
40 {
41     unsigned char *buf, *raw;
42     *len = 0;
43
44     xht_walk(h,_sd2txt_count,(void*)len);
45     if(!*len)
46     {
47         *len = 1;
48         buf = (unsigned char *)malloc(1);
49         *buf = 0;
50         return buf;
51     }
52     raw = buf = (unsigned char *)malloc(*len);
53     xht_walk(h,_sd2txt_write,&buf);
54     return raw;
55 }
56
57 xht txt2sd(unsigned char *txt, int len)
58 {
59     char key[256], *val;
60     xht h = 0;
61
62     if(txt == 0 || len == 0 || *txt == 0) return 0;
63     h = xht_new(23);
64
65     // loop through data breaking out each block, storing into hashtable
66     for(;*txt <= len && len > 0; len -= *txt, txt += *txt + 1)
67     {
68         if(*txt == 0) break;
69         memcpy(key,txt+1,*txt);
70         key[*txt] = 0;
71         if((val = strchr(key,'=')) != 0)
72         {
73             *val = 0;
74             val++;
75         }
76         xht_store(h, key, strlen(key), val, val ? strlen(val) : 0);
77     }
78     return h;
79 }