current version
[opsoft_test.git] / gclib2 / modules / Core / earray.cxx
blob0cb3a8299db0528416754efa76ae8d61add41872
1 /*
2 * (c) Oleg Puchinin 2006
3 * graycardinalster@gmail.com
5 */
7 #include "gclib2.h"
9 /* Extendent array */
10 EArray::EArray (int asize)
14 /// Добавить элемент в массив.
15 int EArray::add (long one)
17 return DArray::add (LPCHAR (one));
20 /// Найти элемента
21 int EArray::find (char * d_find)
23 int i;
24 int d_size = get_size ();
26 if (! d_find)
27 return -1;
29 for (i = 0; i < d_size; ++i) {
30 if (get (i) == d_find)
31 return i;
34 return -1;
37 /// Искать строку в массиве.
38 int EArray::sfind (char * d_find)
40 int i;
41 int d_size = get_size ();
42 char ** d_array = get_skeleton ();
44 if (! d_find)
45 return -1;
47 for (i = 0; i < d_size; i++) {
48 if (EQ (d_find, d_array[i]))
49 return i;
52 return -1;
55 /// Искать начало строки в массиве.
56 int EArray::snfind (char * d_find)
58 int i;
59 int d_size = get_size ();
60 char ** d_array = get_skeleton ();
62 for (i = 0; i < d_size; i++) {
63 if (!strncmp (d_find, d_array[i], strlen (d_array[i])))
64 return i;
67 return -1;
70 /// Добавить вектор к массиву.
71 void EArray::push (char ** d_push)
73 int i = 0;
74 if (d_push == NULL)
75 return;
77 while (d_push[i]) {
78 add ((long) d_push[i]);
79 ++i;
83 /// Быстро найти начало строки в отсортированном массиве.
84 int EArray::snfind_fast (char *str, int n)
86 int first;
87 int last;
88 int fact;
89 int check;
90 int move;
92 first = 0;
93 last = get_size ();
94 --last;
95 if (last < 0)
96 return -1;
98 if (strcmp (get (0), str) > 0)
99 return -1;
101 while (true) {
102 move = (last - first) >> 1;
103 if (! move) {
104 if (EQ (get (first), str))
105 return first;
106 if (EQ (get (last), str))
107 return last;
108 return -1;
111 check = first + move;
112 if (n)
113 fact = strncmp (get (check), str, n);
114 else
115 fact = strcmp (get (check), str);
117 if (fact < 0) { // [check] < str
118 first = check;
119 } else if (! fact) { // [check] == str
120 return check;
121 } else if (fact > 0) { // [chec] > str
122 last = check;
126 if (EQ (get (first), str))
127 return first;
129 return -1;
132 /// Прочитать массив из трубы.
133 int EArray::from_pipe (int fd)
135 char * buf;
136 FILE * m_file;
138 m_file = fdopen (fd, "r");
139 if (m_file == NULL)
140 return false;
142 buf = CNEW (char, 256);
143 while (true) {
144 if (fgets (buf, 256, m_file) == NULL)
145 break;
146 add (strdup (buf));
149 fclose (m_file);
150 DROP (buf);
151 return get_size ();
154 /// Объеденить массив (элементами mid).
155 char * EArray::join (char * mid, int *len_out)
157 char *Ret;
158 char *ptr;
159 int count;
160 int len = 0;
161 int mid_len;
162 int i;
164 if (! mid) {
165 mid_len = 0;
166 mid = "";
167 } else
168 mid_len = strlen (mid);
170 count = get_size ();
171 for (i = 0; i < count; i++)
172 len += strlen (get (i));
174 if (mid)
175 len += count * mid_len;
177 len++;
178 Ret = CNEW (char, len);
179 ptr = Ret;
180 for (i = 0; i < count; i++) {
181 strcpy (ptr, (char *) get (i));
182 ptr += strlen (get (i));
183 strcpy (ptr, mid);
184 ptr += mid_len;
187 if (len_out)
188 *len_out = len;
190 return Ret;
193 /// Записать вектор строк в файл.
194 int EArray::strings_to_file (char * f_name)
196 FILE * d_file;
197 int d_len;
198 int i;
200 d_file = fopen (f_name, "w");
201 if (! d_file)
202 return -1;
204 d_len = get_size ();
205 for (i = 0; i < d_len; ++i)
206 fprintf (d_file, "%s\n", get (i));
208 fclose (d_file);
209 return d_len;
212 EArray & EArray::operator << (char *S)
214 add (S);
215 return *this;
218 int EArray::expand (EArray * e)
220 int count;
221 int i;
223 if (! e)
224 return get_size ();
226 count = e->get_size ();
227 if (! count)
228 return get_size ();
230 for (i = 0; i < count; ++i)
231 add (e->get (i));
233 return get_size ();
236 int EArray::expand (char *buf, char * split)
238 char * S;
239 char * ptr = buf;
240 int split_len;
241 char * last;
243 if (!buf || !split || !(*buf))
244 return -1;
246 last = &buf[strlen (buf)-1];
247 split_len = strlen (split);
248 while((S = Dmid_memmem (ptr, last, split, split_len)) && S) {
249 add (Dstrndup (ptr, S - ptr));
250 S += split_len;
251 ptr = S;
254 if (ptr <= last)
255 add (Dstrndup (ptr, last-ptr+1));
257 return get_size ();
260 /// Распечатать массив (в stdout)
261 int EArray::dump (char * d_join)
263 int i;
264 int count;
266 count = get_size ();
267 for (i = 0; i < count; ++i)
268 printf ("%s%s", get (i), d_join);
270 return count;
273 List * EArray::toList ()
275 List * m_list;
276 int count;
277 int i;
279 count = get_size ();
280 m_list = new List;
281 for (i = 0; i < count; ++i)
282 m_list->add (get (i));
284 return m_list;