2 * (c) Oleg Puchinin 2006
3 * graycardinalster@gmail.com
10 EArray::EArray (int asize
)
14 /// Добавить элемент в массив.
15 int EArray::add (long one
)
17 return DArray::add (LPCHAR (one
));
21 int EArray::find (char * d_find
)
24 int d_size
= get_size ();
29 for (i
= 0; i
< d_size
; ++i
) {
30 if (get (i
) == d_find
)
37 /// Искать строку в массиве.
38 int EArray::sfind (char * d_find
)
41 int d_size
= get_size ();
42 char ** d_array
= get_skeleton ();
47 for (i
= 0; i
< d_size
; i
++) {
48 if (EQ (d_find
, d_array
[i
]))
55 /// Искать начало строки в массиве.
56 int EArray::snfind (char * d_find
)
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
])))
70 /// Добавить вектор к массиву.
71 void EArray::push (char ** d_push
)
78 add ((long) d_push
[i
]);
83 /// Быстро найти начало строки в отсортированном массиве.
84 int EArray::snfind_fast (char *str
, int n
)
98 if (strcmp (get (0), str
) > 0)
102 move
= (last
- first
) >> 1;
104 if (EQ (get (first
), str
))
106 if (EQ (get (last
), str
))
111 check
= first
+ move
;
113 fact
= strncmp (get (check
), str
, n
);
115 fact
= strcmp (get (check
), str
);
117 if (fact
< 0) { // [check] < str
119 } else if (! fact
) { // [check] == str
121 } else if (fact
> 0) { // [chec] > str
126 if (EQ (get (first
), str
))
132 /// Прочитать массив из трубы.
133 int EArray::from_pipe (int fd
)
138 m_file
= fdopen (fd
, "r");
142 buf
= CNEW (char, 256);
144 if (fgets (buf
, 256, m_file
) == NULL
)
154 /// Объеденить массив (элементами mid).
155 char * EArray::join (char * mid
, int *len_out
)
168 mid_len
= strlen (mid
);
171 for (i
= 0; i
< count
; i
++)
172 len
+= strlen (get (i
));
175 len
+= count
* mid_len
;
178 Ret
= CNEW (char, len
);
180 for (i
= 0; i
< count
; i
++) {
181 strcpy (ptr
, (char *) get (i
));
182 ptr
+= strlen (get (i
));
193 /// Записать вектор строк в файл.
194 int EArray::strings_to_file (char * f_name
)
200 d_file
= fopen (f_name
, "w");
205 for (i
= 0; i
< d_len
; ++i
)
206 fprintf (d_file
, "%s\n", get (i
));
212 EArray
& EArray::operator << (char *S
)
218 int EArray::expand (EArray
* e
)
226 count
= e
->get_size ();
230 for (i
= 0; i
< count
; ++i
)
236 int EArray::expand (char *buf
, char * split
)
243 if (!buf
|| !split
|| !(*buf
))
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
));
255 add (Dstrndup (ptr
, last
-ptr
+1));
260 /// Распечатать массив (в stdout)
261 int EArray::dump (char * d_join
)
267 for (i
= 0; i
< count
; ++i
)
268 printf ("%s%s", get (i
), d_join
);
273 List
* EArray::toList ()
281 for (i
= 0; i
< count
; ++i
)
282 m_list
->add (get (i
));