02.01.2010, 20:13
В общем разделе есть похожая темка, где человеки могут поделится очень ценными функциями или инструментами, не создавая никаких новых тем и релизов библиотек. Желающие могут запостить тут свои (возможно, чужие) функции, макросы и их описание. Естессна, от функции или макроса должен быть толк (:
* Желательно не более 5 штук в посте, а то всем будет не очень приятно читать и просматривать.
* Флуд из темы будет удаляться. Остаются только скрипты/функции/макросы и сообщения строго по теме.
Начну я с небольших но быстрых функций. Описание прямо в комментах в коде.
Вот код для тестирования - http://pastebin.mozilla-russia.org/103683.
модер: подправил название, чтобы тема отражала смысл более четко
* Желательно не более 5 штук в посте, а то всем будет не очень приятно читать и просматривать.
* Флуд из темы будет удаляться. Остаются только скрипты/функции/макросы и сообщения строго по теме.
Начну я с небольших но быстрых функций. Описание прямо в комментах в коде.
Вот код для тестирования - http://pastebin.mozilla-russia.org/103683.
Code:
/* Выдёргивает из строки source[], разделенной пробелами, подстроку под указанным индексом index и помещает ее в dest[] Фактически это шустрая замена strtok и похожих функций maxsize это максимальная длина подстроки, если подстрока больше этой длина, то она будет урезана При вызове этой функции в ОЗУ выделяется не более 5 временных pawn ячеек (20 байт) ПРИМЕРЫ new dest[20], source[] = "/givecash 17 50000"; sparam( dest, 20, source, -1 ); // в dest будет помещено "", т.к. такой индекс не существует sparam( dest, 20, source, 0 ); // в dest будет помещено "/givecash" sparam( dest, 20, source, 1 ); // в dest будет помещено "17" sparam( dest, 20, source, 2 ); // в dest будет помещено "50000" sparam( dest, 20, source, 3 ); // в dest будет помещено "", т.к. такой индекс не существует */ stock sparam ( dest[], maxsize = sizeof(dest), source[], index = 0 ) { dest[0] = 0; for ( new cur, pre, i = -1; ; cur++ ) { switch ( source[cur] ) { case ' ' : { if ( ++i == index ) { strmid( dest, source, pre, cur, maxsize ); return; } pre = cur + 1; } case 0 : { if ( ++i == index ) strmid( dest, source, pre, cur, maxsize ); return; } } } } /* А это макрос, аналогичный функции sparam, который по логике должен работать еще быстрее, т.к. это вовсе не функция. Параметры и их порядок такой же как у функции sparam. При вызове этого макроса в ОЗУ выделяется не более 3 временных pawn ячеек (12 байт) */ #define m_sparam(%0,%1,%2,%3) %0[0]=0;for(new cur,pre,i=(-1);;cur++){switch(%2[cur]){case ' ':{if(++i==(%3)){strmid(%0,%2,pre,cur,(%1));break;}pre=cur+1;}case 0:{if(++i==%3)strmid(%0,%2,pre,cur,(%1));break;}}}