1 
2 /*-------------------------------------------------------------*/
3 typedef enum {
4   NETWIB_ENCODETYPE_DATA = 1,        /* exact data */
5   NETWIB_ENCODETYPE_HEXA0,           /* hexadecimal */
6   NETWIB_ENCODETYPE_HEXA1,           /* hexadecimal */
7   NETWIB_ENCODETYPE_HEXA2,           /* hexadecimal */
8   NETWIB_ENCODETYPE_HEXA4,           /* hexadecimal */
9   NETWIB_ENCODETYPE_MIXED0,          /* mixed */
10   NETWIB_ENCODETYPE_MIXED1,          /* mixed */
11   NETWIB_ENCODETYPE_TEXT,            /* printable text */
12   NETWIB_ENCODETYPE_BASE64,          /* base64 */
13   NETWIB_ENCODETYPE_QUOTED,          /* quoted */
14   NETWIB_ENCODETYPE_NOTHING = 100,   /* print nothing */
15   NETWIB_ENCODETYPE_SYNTH,           /* print a synthetic form */
16   /* wrap to 80 columns (or less) */
17   NETWIB_ENCODETYPE_DATA_WRAP = 300, /* data */
18   NETWIB_ENCODETYPE_HEXA0_WRAP,      /* hexa (32 bytes per line) */
19   NETWIB_ENCODETYPE_HEXA1_WRAP,      /* hexa (16 bytes per line) */
20   NETWIB_ENCODETYPE_HEXA2_WRAP,      /* hexa (32 bytes per line) */
21   NETWIB_ENCODETYPE_HEXA4_WRAP,      /* hexa (32 bytes per line) */
22   NETWIB_ENCODETYPE_MIXED0_WRAP,     /* mixed (16 bytes per line) */
23   NETWIB_ENCODETYPE_MIXED1_WRAP,     /* mixed (16 bytes per line) */
24   NETWIB_ENCODETYPE_TEXT_WRAP,       /* printable text */
25   NETWIB_ENCODETYPE_BASE64_WRAP,     /* base64 */
26   NETWIB_ENCODETYPE_ARRAY1 = 400,    /* array (4 bytes per line) */
27   NETWIB_ENCODETYPE_ARRAY4,          /* array (4 bytes per line) */
28   NETWIB_ENCODETYPE_ARRAY8,          /* array (4 bytes per line) */
29   NETWIB_ENCODETYPE_ARRAY16,         /* array (4 bytes per line) */
30   NETWIB_ENCODETYPE_ARRAY32,         /* array (4 bytes per line) */
31   NETWIB_ENCODETYPE_DUMP,            /* dump (16 bytes per line) */
32   NETWIB_ENCODETYPE_MIXED0H_WRAP,    /* mixed (8 bytes per line) */
33   NETWIB_ENCODETYPE_MIXED1H_WRAP,    /* mixed (8 bytes per line) */
34   NETWIB_ENCODETYPE_LOWERCASE,       /* lower case */
35   NETWIB_ENCODETYPE_UPPERCASE,       /* upper case */
36   /* aliases */
37   NETWIB_ENCODETYPE_HEXA = NETWIB_ENCODETYPE_HEXA1,
38   NETWIB_ENCODETYPE_MIXED = NETWIB_ENCODETYPE_MIXED1,
39   NETWIB_ENCODETYPE_HEXA_WRAP = NETWIB_ENCODETYPE_HEXA1_WRAP,
40   NETWIB_ENCODETYPE_MIXED_WRAP = NETWIB_ENCODETYPE_MIXED1_WRAP,
41   NETWIB_ENCODETYPE_ARRAY = NETWIB_ENCODETYPE_ARRAY8,
42   NETWIB_ENCODETYPE_MIXEDH_WRAP = NETWIB_ENCODETYPE_MIXED1H_WRAP,
43   /* for transition */
44   NETWIB_ENCODETYPE_TRANSITION_INIT = 500,
45   NETWIB_ENCODETYPE_TRANSITION_END
46 } netwib_encodetype;
47 
48 /*-------------------------------------------------------------*/
49 /* Examples :
50 NETWIB_ENCODETYPE_HEXA0  : 01020304050607080910...
51 NETWIB_ENCODETYPE_HEXA1  : 01 02 03 04 05 06 07 08 09 10 ...
52 NETWIB_ENCODETYPE_HEXA2  : 0102 0304 0506 0708 0910 ...
53 NETWIB_ENCODETYPE_HEXA4  : 01020304 05060708 0910...
54 NETWIB_ENCODETYPE_MIXED0 : 'abc' 112233445566
55 NETWIB_ENCODETYPE_MIXED1 : 'abc' 11 22 33 44 55 66
56 NETWIB_ENCODETYPE_HEXA0_WRAP :
57 0102030405060708091011121314151617181920212223242526272829303132
58 NETWIB_ENCODETYPE_HEXA1_WRAP :
59 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
60 NETWIB_ENCODETYPE_HEXA2_WRAP :
61 0102 0304 0506 0708 0910 1112 1314 1516 1718 1920 2122 2324 2526 2728 2930 3132
62 NETWIB_ENCODETYPE_HEXA4_WRAP :
63 01020304 05060708 09101112 13141516 17181920 21222324 25262728 29303132
64 NETWIB_ENCODETYPE_MIXED0_WRAP :
65 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02
66 'a' 026102 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02
67 NETWIB_ENCODETYPE_MIXED1_WRAP :
68 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02
69 'a' 02 61 02 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02 'a' 02
70 NETWIB_ENCODETYPE_ARRAY1 :
71 |1|0|0|0|0|1|1|0|0|1|0|0|0|1|1|0|1|1|0|0|0|1|1|0|0|0|1|0|0|1|1|0|
72 NETWIB_ENCODETYPE_ARRAY4 :
73 |__0x1__|__0x6__|_______________|_______________|_______________|
74 NETWIB_ENCODETYPE_ARRAY8 :
75 |____0x80=128___|____0x11=17____|____0x80=128___|____0x11=17____|
76 NETWIB_ENCODETYPE_ARRAY16 :
77 |_________0x6162=24930__________|_________0x6364=25444__________|
78 NETWIB_ENCODETYPE_ARRAY32 :
79 |_____________________0x61626364=1633837924_____________________|
80 NETWIB_ENCODETYPE_DUMP :
81 61 62 63 64  65 66 67 68  69 6a 6b 6c  6d 6e 6f 70  # abcdefghijklmnop
82 NETWIB_ENCODETYPE_MIXED0H_WRAP :
83 'a' 62 'c' 64 'e' 66 'f' 68             # 61 62 63 64 65 66 67 68
84 'a' 626364 'e' 66 'f' 68                # 61 62 63 64 65 66 67 68
85 NETWIB_ENCODETYPE_MIXED1H_WRAP :
86 'a' 62 'c' 64 'e' 66 'f' 68             # 61 62 63 64 65 66 67 68
87 'a' 62 63 64 'e' 66 'f' 68              # 61 62 63 64 65 66 67 68
88 NETWIB_ENCODETYPE_QUOTED :
89 "abc d \\ \t \n \r \" \x00 z"
90 */
91 
92 /*-------------------------------------------------------------*/
93 /* Name : netwib_buf_encode
94    Description :
95      Append a encoded buffer.
96    Input parameter(s) :
97      *pbuftoencode : buffer to encode
98      encodetype : decoding type
99    Input/output parameter(s) :
100      *pbuf : netwib_buf updated
101    Output parameter(s) :
102    Normal return values :
103      NETWIB_ERR_OK : ok
104    This function supports NETWIB_BUF_FLAGS_SENSITIVE.
105 */
106 netwib_err netwib_buf_encode(netwib_constbuf *pbuftoencode,
107                              netwib_encodetype encodetype,
108                              netwib_buf *pbuf);
109 /* only the main ones are defined */
110 #define netwib_buf_encode_data(pbuftoencode,pbuf) netwib_buf_encode(pbuftoencode,NETWIB_ENCODETYPE_DATA,pbuf)
111 #define netwib_buf_encode_hexa(pbuftoencode,pbuf) netwib_buf_encode(pbuftoencode,NETWIB_ENCODETYPE_HEXA,pbuf)
112 #define netwib_buf_encode_mixed(pbuftoencode,pbuf) netwib_buf_encode(pbuftoencode,NETWIB_ENCODETYPE_MIXED,pbuf)
113 #define netwib_buf_encode_text(pbuftoencode,pbuf) netwib_buf_encode(pbuftoencode,NETWIB_ENCODETYPE_TEXT,pbuf)
114 #define netwib_buf_encode_base64(pbuftoencode,pbuf) netwib_buf_encode(pbuftoencode,NETWIB_ENCODETYPE_BASE64,pbuf)
115 #define netwib_buf_encode_quoted(pbuftoencode,pbuf) netwib_buf_encode(pbuftoencode,NETWIB_ENCODETYPE_QUOTED,pbuf)
116 #define netwib_buf_encode_dump(pbuftoencode,pbuf) netwib_buf_encode(pbuftoencode,NETWIB_ENCODETYPE_DUMP,pbuf)
117 #define netwib_buf_encode_lowercase(pbuftoencode,pbuf) netwib_buf_encode(pbuftoencode,NETWIB_ENCODETYPE_LOWERCASE,pbuf)
118 #define netwib_buf_encode_uppercase(pbuftoencode,pbuf) netwib_buf_encode(pbuftoencode,NETWIB_ENCODETYPE_UPPERCASE,pbuf)
119 
120 /*-------------------------------------------------------------*/
121 typedef struct {
122   netwib_encodetype last;
123   netwib_bool containnl;
124 } netwib_encodetype_context;
125 /* Name : netwib_buf_encode_transition
126    Description :
127      Append a transition between two data.
128      First call has to be done with NETWIB_ENCODETYPE_TRANSITION_INIT.
129    Input parameter(s) :
130      encodetype : next encoding type
131    Input/output parameter(s) :
132      *pctx : context
133      *pbuf : netwib_buf updated
134    Output parameter(s) :
135    Normal return values :
136      NETWIB_ERR_OK : ok
137 */
138 netwib_err netwib_buf_encode_transition(netwib_encodetype_context *pctx,
139                                         netwib_encodetype encodetype,
140                                         netwib_buf *pbuf);
141 #define netwib_buf_encode_transition_init(pctx) netwib_buf_encode_transition(pctx,NETWIB_ENCODETYPE_TRANSITION_INIT,NULL)
142 #define netwib_buf_encode_transition_end(pctx,pbuf) netwib_buf_encode_transition(pctx,NETWIB_ENCODETYPE_TRANSITION_END,pbuf)
143