Написал несколько функций для работы со строками, хочу оформить как либу, и не знаю, может чего ещё забыл. Тут список: Код (Text): strcmp сравнение двух строк strcmpi регистронезависимое сравнение двух строк instr поиск подстроки instri регистронезависимый поиск подстроки strlen подсчёт длины строки strcpy копирование строки strlcase перевод символов строки в нижний регистр strucase перевод символов строки в верхний регистр strleft выделение n-символов из левой части строки strright выделение n-символов из правой части строки strmid выделение n-символов из середины строки strltrim удаление лидирующих пробелов и табов strrtrim удаление замыкающих пробелов и табов strtrim удаление лидирующих и замыкающих пробелов и табов strremove удаление всех вхождений подстроки в строку strreplace замена всех вхождений подстроки в строку на другую подстроку strrev разворот строки multicat соединение нескольких строк в одну Какие ещё функции для работы с zero-terminated строками можно добавить?
Broken Sword Упор делался не на размер, а на скорость. Если нужен малый размер, то можно воспользоваться апи: lstrlen, lstrcmp, lstrcpy и т.д. Один call и всё
S_T_A_S_ речь о unicode? Если да, то это полезная мысль. Особо ими не пользовался, поэтому unicode ускользнул из поля зрения Пока сделано только для обычных.
Ну я так думаю, что для того, что бы заявлять поддержку unicode, нужно ещё и конвертацию строчек добавить. А без этого просто будут двубайтные символы По поводу strcpy и подобных. Иногда может быть полезен вариант, когда ф-ция возвращает не адрес начала destination, а адрес завершающего нуля, может быть это стОит учесть?
strchr - поиск символа в строке strstr - поиск одного из символов strspn - длина начального куска строки состоящего из определённых символов strdup дублирование строки strcasecmp - сравнение без учёта регистра
S_T_A_S_ Это уже учтено, только не адрес завершающего, а длина строк возвращается из всех функций, где это имеет смысл. Либо индикатор ошибки. С двубайтовыми символами часть функций работать будет, кроме тех, что работают регистронезависимо, и strtrim/ltrim/rtrim , strrev. Для них есть смысл сделать отдельные версии функций. И конвертацию тоже. rgo Это уже есть: strstr - это instr, (strchr как частный случай) strdup - strcpy strcasecmp - strcmpi strspn - это определение длины, в течение которой в строке встретились все символы, входящие в подстроку. Где может понадобиться не знаю, но можно будет для разнообразия добавить. Avoidik Есть, только не все, из тех, что есть в асмовом пакете некоторые функции не обеспечивают необходимой функциональности, некоторые с ошибками. И медленней работают, как и crt-варианты.
slow Как передавать маску? Т.е. как обозначать символы, которые "??" Непечатными символами? Или ещё как?
cresta > Это хорошо. А индикатор ошибки что из себя представляет? Ноль\не ноль в регистре или ещё и флаги какие-то устанавливаются, что бы потом лишнюю проверку не делать? > C масками IMHO сложно. Если развивать эту идею как следует, то получатся регэкспы, по типу как в пёрле
Индикатор ошибки - обычно знак eax(минус). На примере instr: eax==zero-based смещение от начала строки, если образец содержится в строке eax==-1 - если образца в строке нет eax==-2 - если ошибочные вход. параметры(стартовая позиция поиска за пределами строки, матчстринг длиннее чем стринг и т.п.) Если устанавливать флаг, то не всегда одним флагом можно однозначно определить все варианты завершения функции, как в данном случае.
Можно использовать комбинацию флагов C(или S) и Z, это даст 3 варианта. Но с флагами есть свои сложности - не всегда удобно формировать нужные флаги, что бы всё функции имели унифицированное их значение при однотипных ошибках.
Что нужнее: strtok или split? Split вроде удобней, но это потребует компоновки в destination-буфере разделенных подстрок и указателей на них, с последующей расшифровкой по выходе из ф-ции. А конвертеры число-строка и обратно это отдельная песня
S_T_A_S_ Я использую вызов с параметром типа Код (Text): invoke find_str, tx("proba"), [m1.mem], 11b ... invoke sravni_str, ADDR tx1_lc, ADDR tx2_lc, FL_CASE_STSTV or FL_EQU ... а успех/неуспех показываю C/NC, результат в eax. Так что вместо нескольких strcmp, strcmpi и пр. у меня одна sravni_str, а ключ сравнения ставишь сам
cresta Не разу не использовал split, поэтому не могу советывать. Посмотри по частоте использвания в исходниках. Еще не плохо было бы иметь функции аналоги Pascal/RTL функций Insert(dest, index, source) и Delete (index, count): strins и strdel соответственно.