current version
[opsoft_test.git] / gclib2 / modules / Misc / join.cxx
blobc9d848b9abae66f8d3c61d23b6aab3f1d89be7cd
1 /*
2 * (c) Oleg Puchinin 2008
3 * graycardinalster@gmail.com
5 */
7 #include <gclib2.h>
9 char * join (List * m_list, char * jn)
11 int jn_len;
12 int len = 0;
13 char * one;
14 char *S;
15 char * m_buf;
17 if (!jn || !m_list)
18 return NULL;
20 jn_len = strlen (jn);
22 m_list->first ();
23 while (true) {
24 S = m_list->get ();
25 if (!S)
26 break;
27 len += strlen (S);
28 m_list->next ();
31 len = len + jn_len * (m_list->count () - 1);
32 m_buf = CNEW (char, len + 1);
33 S = m_buf;
34 m_list->first ();
35 while (true) {
36 one = m_list->get ();
37 if (! one)
38 break;
39 S = strmov (S, one);
40 if (m_list->next ())
41 S = strmov (S, jn);
44 return m_buf;
47 Buf * bjoin (List * m_list, Buf * jn)
49 int jn_len = 0;
50 int count = 0;
51 Buf * b;
52 Buf * m_buf;
53 char * m_pos;
55 if (! m_list)
56 return NULL;
58 if (jn)
59 jn_len = jn->len ();
61 m_list->first ();
62 while (true) {
63 b = (Buf *) m_list->get ();
64 if (! b)
65 break;
66 count += b->len ();
67 if (m_list->next ())
68 count += jn_len;
71 m_buf = new Buf (count);
72 m_pos = m_buf->data ();
73 m_list->first ();
74 while (true) {
75 b = (Buf *) m_list->get ();
76 if (! b)
77 break;
79 if (b->len () > 0) {
80 memcpy (m_pos, b->data (), b->len ());
81 m_pos += b->len ();
84 if (m_list->next () && jn) {
85 memcpy (m_pos, jn->data (), jn->len ());
86 m_pos += jn_len;
90 m_list->first ();
91 return m_buf;