2 * (c) Oleg Puchinin 2006
3 * graycardinalster@gmail.com
15 /// Увеличить размер блока (с копированием).
16 __export
char * gc_realloc (char * PTR
, int old_size
, int new_size
)
19 char * S
= (char *) malloc (new_size
);
23 i
= (new_size
>= old_size
) ? old_size
: new_size
;
29 /// Скопировать блок памяти.
30 __export
void * memdup (void * PTR
, int size
)
33 Ret
= (char *) malloc (size
);
34 memcpy (Ret
, PTR
, size
);
39 /// Разбить текст строкой (аналог "split" perl'а).
40 __export
int Dsplit(char * lpsz_String
, char *ch
, char ** outbuffer
, int int_buffersize
)
51 if(int_buffersize
> 0) {
58 while(S
&& (int_buffersize
--)) {
68 /// lpsz_string =~ m/param1(.*)param2/
69 __export
char * Dstrmid(char * lpsz_string
,char * param1
, char * param2
)
79 S
= strstr (lpsz_string
,param1
);
83 S2
= strstr (S
,param2
);
91 Result
= (char *) malloc (int_strsize
+ 1);
92 memcpy (Result
, S
, int_strsize
);
93 Result
[int_strsize
] = 0;
97 /// Убить конец строки.
98 __export
char * chomp (char * S
)
103 str
= strchrs (S
, 13, 10, 0, 0);
109 /// Найти символ (с конца строки). d_len - исходной строки (если известна).
110 __export
char * strchr_r (char * S
, char ch
, int d_len
)
126 /// Найти один из символов.
127 __export
char * strchrs (char *S
, char ch
, char ch2
, char ch3
, char ch4
)
145 if (*S
== ch
|| *S
== ch2
|| *S
== ch3
|| *S
== ch4
)
152 /// Найти строку (с конца исходной).
153 __export
char * Dstrstr_r (char *where
, char * str
)
158 if (! where
|| ! str
|| strlen (where
) == 0)
161 S
= &where
[strlen (where
)];
164 while (--S
!= where
) {
165 if (! strncmp (S
, str
, len
))
172 /// Посчитать Количество символов от from до to-1.
173 __export
int Dsyms (char * from
, char * to
, char sym
)
179 } while (++from
!= to
);
183 /// Найти символ в буфере.
184 __export
char * Dmemchr (char * from
, int n
, char ch
)
194 /// Скопировать не более n символов строки ptr.
195 __export
char * Dstrndup (char *ptr
, int n
)
200 if (ptr
== NULL
|| n
<= 0)
203 buf
= (char *) malloc (n
+1);
205 while (*ptr
&& n
--) {
214 /// Найти символ между ptr и end (включительно).
215 __export
char * Dmid_strchr (char *ptr
, char *end
, char ch
)
225 /// Выбрать (с копирование памяти) строку между buf и end (включительно).
226 __export
char * Dmid_getstr (char *buf
, char *end
)
235 S
= Dmid_strchr (buf
, end
, '\n');
240 out
= (char *) malloc (s_len
+1);
241 memcpy (out
, buf
, s_len
);
247 /// Получить рандомную строку на count символов.
248 __export
char * Drand_str (char * buf
, int count
)
257 for (i
= 0; i
< count
; ++i
) {
258 ch
= rand () % ('z' - 'a' - 1);
266 /// Перевести число в строку (результат - новая LPSZ строка).
267 __export
char * int2str (int i
)
270 sprintf (buf
, "%i", i
);
274 /// Вернуть указатель на последний ноль строки.
275 __export
char * stail (char *S
)
279 return &S
[strlen (S
)];
282 /// Копировать строку. Результат - конец результирующей строки.
283 __export
char * strmov (char *buf
, char * S
)
288 return buf
+strlen (S
);
291 __export
char * strnmov (char *buf
, char * S
, int N
)
300 len
= (len
>= N
) ? N
: len
;
306 /// Убрать все начальные пробельные символы.
307 __export
char * strip (char *str
)
313 while (*S
&& (*S
== '\t' || *S
== ' '))
320 /// Убрать все конечные пробельные символы.
321 __export
char * strip2 (char *str
)
328 while (S
!= str
&& (*S
== ' ' || *S
== '\t'))
335 /// Кросс-платформенный аналог memmem (3)
336 __export
char * Dmemmem (char *haystack
, size_t haystacklen
, char *needle
, size_t needlelen
)
341 if (! haystack
|| ! needle
)
344 if (haystacklen
< needlelen
)
348 end
= &haystack
[haystacklen
] - needlelen
+ 1;
349 while (ptr
!= end
&& memcmp (ptr
, needle
, needlelen
))
358 /// Найти блок между begin и last (включительно).
359 __export
char * Dmid_memmem (char * begin
, char * last
, char * needle
, int needlelen
)
363 if (! begin
|| ! needle
)
366 if ((last
- begin
- 1) < needlelen
)
372 while (ptr
<= last
&& memcmp (ptr
, needle
, needlelen
))
381 /// Создать новую форматированную строку (не более 511 символов).
382 __export
char * Dsprintf (char * fmt
, ...)
388 vsnprintf (m_buf
, 511, fmt
, ap
);
390 return strdup (m_buf
);
393 __export
char * strinsert (char * base
, char *ptr
, char *ins
, int rewrite
)
401 if (!base
|| !ptr
|| !ins
)
404 ins_len
= strlen (ins
);
405 part1_len
= ptr
- base
;
406 part2_len
= strlen (&ptr
[rewrite
]);
408 m_buf
= CNEW (char, ins_len
+ part1_len
+ part2_len
+ 1);
409 m_buf
= CNEW (char, 4096);
412 S
= strnmov (m_buf
, base
, part1_len
);
414 S
= strmov (S
, &ptr
[rewrite
]);
419 __export
char * strreplace (char * buf
, char * oldstr
, char * newstr
)
424 if (!buf
|| !oldstr
|| !newstr
)
427 m_list
= split (buf
, oldstr
);
430 m_buf
= join (m_list
, newstr
);
431 m_list
->foreach (free
);