либа для строк

Тема в разделе "WASM.ASSEMBLER", создана пользователем cresta, 21 июн 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Написал несколько функций для работы со строками, хочу оформить как либу, и не знаю, может чего ещё забыл. Тут список:


    Код (Text):
    1. strcmp      сравнение двух строк
    2. strcmpi     регистронезависимое сравнение двух строк
    3. instr       поиск подстроки
    4. instri      регистронезависимый поиск подстроки
    5. strlen      подсчёт длины строки
    6. strcpy      копирование строки
    7. strlcase    перевод символов строки в нижний регистр
    8. strucase    перевод символов строки в верхний регистр
    9. strleft     выделение n-символов из левой части строки
    10. strright    выделение n-символов из правой части строки
    11. strmid      выделение n-символов из середины строки
    12. strltrim    удаление лидирующих пробелов и табов
    13. strrtrim    удаление замыкающих пробелов и табов
    14. strtrim     удаление лидирующих и замыкающих пробелов и табов
    15. strremove   удаление всех вхождений подстроки в строку
    16. strreplace  замена всех вхождений подстроки в строку на другую подстроку
    17. strrev      разворот строки
    18. multicat    соединение нескольких строк в одну




    Какие ещё функции для работы с zero-terminated строками можно добавить?
     
  2. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    в некоторых не вижу смысла (strcmp, strcpy), т.к. выполняются они одной командой
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Broken Sword

    Упор делался не на размер, а на скорость. Если нужен малый размер, то можно воспользоваться апи: lstrlen, lstrcmp, lstrcpy и т.д. Один call и всё :)
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Поддержка двубайтных символов планируется ?
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    S_T_A_S_

    речь о unicode? Если да, то это полезная мысль. Особо ими не пользовался, поэтому unicode ускользнул из поля зрения :)

    Пока сделано только для обычных.
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Ну я так думаю, что для того, что бы заявлять поддержку unicode, нужно ещё и конвертацию строчек добавить. А без этого просто будут двубайтные символы :)



    По поводу strcpy и подобных. Иногда может быть полезен вариант, когда ф-ция возвращает не адрес начала destination, а адрес завершающего нуля, может быть это стОит учесть?
     
  7. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    strchr - поиск символа в строке

    strstr - поиск одного из символов

    strspn - длина начального куска строки состоящего из определённых символов

    strdup дублирование строки

    strcasecmp - сравнение без учёта регистра
     
  8. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    всё это есть в asmpack'e, а также в crt от vs.net (и там, и там на асме)
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    S_T_A_S_





    Это уже учтено, только не адрес завершающего, а длина строк возвращается из всех функций, где это имеет смысл. Либо индикатор ошибки.



    С двубайтовыми символами часть функций работать будет, кроме тех, что работают регистронезависимо, и strtrim/ltrim/rtrim , strrev. Для них есть смысл сделать отдельные версии функций. И конвертацию тоже.



    rgo

    Это уже есть:

    strstr - это instr, (strchr как частный случай)

    strdup - strcpy

    strcasecmp - strcmpi

    strspn - это определение длины, в течение которой в строке встретились все символы, входящие в подстроку. Где может понадобиться не знаю, но можно будет для разнообразия добавить.



    Avoidik

    Есть, только не все, из тех, что есть в асмовом пакете некоторые функции не обеспечивают необходимой функциональности, некоторые с ошибками. И медленней работают, как и crt-варианты.
     
  10. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    strncpy - копирование заданного числа символов строки 1 в строку 2

    strncmp

    strncmpi
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    поиск в строке подстроки с маской?

    например 1??2
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    rmn

    Угу.
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    slow

    Как передавать маску? Т.е. как обозначать символы, которые "??" Непечатными символами? Или ещё как?
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    cresta >




    Это хорошо. А индикатор ошибки что из себя представляет? Ноль\не ноль в регистре или ещё и флаги какие-то устанавливаются, что бы потом лишнюю проверку не делать?



    >




    C масками IMHO сложно. Если развивать эту идею как следует, то получатся регэкспы, по типу как в пёрле :)
     
  15. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Индикатор ошибки - обычно знак eax(минус). На примере instr:

    eax==zero-based смещение от начала строки, если образец содержится в строке

    eax==-1 - если образца в строке нет

    eax==-2 - если ошибочные вход. параметры(стартовая позиция поиска за пределами строки, матчстринг длиннее чем стринг и т.п.)



    Если устанавливать флаг, то не всегда одним флагом можно однозначно определить все варианты завершения функции, как в данном случае.
     
  16. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Можно использовать комбинацию флагов C(или S) и Z, это даст 3 варианта. Но с флагами есть свои сложности - не всегда удобно формировать нужные флаги, что бы всё функции имели унифицированное их значение при однотипных ошибках.
     
  17. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    strtok - полезная функция.

    а также конверторы в long/int64/float/double.
     
  18. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Что нужнее: strtok или split? Split вроде удобней, но это потребует компоновки в destination-буфере разделенных подстрок и указателей на них, с последующей расшифровкой по выходе из ф-ции.

    А конвертеры число-строка и обратно это отдельная песня :)
     
  19. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    S_T_A_S_

    Я использую вызов с параметром типа
    Код (Text):
    1.  
    2. invoke find_str, tx("proba"), [m1.mem], 11b
    3. ...
    4. invoke sravni_str, ADDR tx1_lc, ADDR tx2_lc, FL_CASE_STSTV or FL_EQU
    5. ...
    6.  


    а успех/неуспех показываю C/NC, результат в eax.

    Так что вместо нескольких strcmp, strcmpi и пр.

    у меня одна sravni_str, а ключ сравнения ставишь сам :)
     
  20. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    cresta

    Не разу не использовал split, поэтому не могу советывать. Посмотри по частоте использвания в исходниках. Еще не плохо было бы иметь функции аналоги Pascal/RTL функций Insert(dest, index, source) и Delete (index, count): strins и strdel соответственно.