Здесь приведены функции для обработки строк. Аналоги для некоторых имеются в стандартных библиотеках языка С.
Скачать файл заголовков(.h), а также библиотеку (.lib).
Структура, описывающая список строк длиной 13 символов (считая завершающий нуль):
struct
recoex {
int act;
unsigned char string[13];
};
struct
List1
{
struct
recoex memb;
struct
List1 *next;
};
act - если 0, строчка не будет
подсвечена, если 1 - будет.
string -
строка, куда записывается имя файла (например).
int cop(struct recoex *sourc,struct recoex
*dest)
Копирует одну структуру в
другую (sourc в dest).
sourc - откуда копируется.
dest - куда копируется.
struct List1 *SEEKendStr(struct List1 *Head)
Возвращает указатель на
последний элемент списка.
Head - указатель на головной
(0-й) элемент списка.
struct
List1 *SEEKend_1Str(struct List1 *Head1)
Возвращает указатель на
предпоследний элемент списка.
Если в списке только один элемент,
возвращает NULL.
Head1 - указатель на голову
списка.
struct
List1 *CRbegStr(struct recoex *sourc1)
Заполняет 0-й элемент списка
(то-есть фактически создает список и возвращает указатель на его начальный
элемент).
sourc1 - откуда берется
информация.
int
ADDendStr(struct List1 *Head2,struct recoex *sourc2)
Добавляет элемент в конец
существующего списка.
Если не удалось выделить память, возвратит 0, если
же все хорошо - 1.
Head2 - указатель на головной
элемент списка.
sourc2 - откуда берется
информация.
void DELendStr(struct List1 *Head5)
Удаляет элемент из конца
существующего списка.
Head5 - Указатель на голову
списка.
int
READonPosStr(struct List1 *Head3,int Pos,struct recoex *res)
Читает элемент списка с
заданным номером (нумерация идет с нуля).
Если мы хотим прочитать элемент за
концом списка, то функция возвратит 0, в противном случае - единицу.
Head3 - указатель на голову
списка (0-й элемент).
Pos - номер элемента, который
должен быть прочитан.
res - куда считывать
информацию.
void
DELallStr(struct List1 *Head3)
Уничтожает список полностью.
Head3 - Указатель на голову
списка.
int
LenStr(struct List1 *Head4)
Определяет количество
элементов в списке.
Head4 -
указатель на голову списка.
int ADDStr(struct List1 **Head6,struct recoex
*sourc6,int Pos)
Добавляет в список элемент,
который встает в заданную позицию (раздвигая остальные элементы).
Если не удалось выделить память, возвратит 0, если
же все хорошо - 1.
Если заданная позиция больше, чем длина списка,
элемент вставляется в конец списка.
Head6 - указатель на голову
списка.
sourc6 - источник информации
(откуда идет копирование).
Pos - заданная позиция.
void
DELStr(struct List1 **Head7,int Pos7)
Удаляет элемент из списка в
заданной позиции.
Если позиция задана за концом
списка, то удаляется последний элемент.
Head7 - указатель на голову
списка.
Pos7 - заданная позиция.
REPStr(struct List1 *Head8,struct recoex
*sourc8,int Pos8)
Заменяет элемент в заданной
позиции.
Если позиция больше, чем длина
списка, то заменяется последний элемент.
Head8 - указатель на голову
списка.
sourc8 - источник информации.
Pos8 - номер (т.е. заданная
позиция).
struct
List
{
int
memb;
struct
List *next;
};
Это вспомогательная структура для создания
списка целых чисел.
struct
List *SEEKend(struct List *Head)
Возвращает указатель на
последний элемент списка.
Head - указатель на головной
(0-й) элемент списка.
struct List *SEEKend_1(struct List *Head)
Возвращает указатель на
предпоследний элемент списка.
Если в списке только один элемент,
возвращает NULL.
Head - указатель на голову
списка.
struct
List *CRbeg(int New)
Заполняет 0-й элемент списка
(то-есть фактически создает список и возвращает указатель на его начальный
элемент).
New - вставляемое в список
число.
int
ADDend(struct List *Head1,int New1)
Добавляет элемент в конец
существующего списка.
Если не удалось выделить память, возвратит 0, если
же все хорошо - 1 (единицу).
Head1 - указатель на головной
элемент списка.
New1 - добавляемое в список
число.
void
DELend(struct List *Head)
Удаляет элемент из конца
существующего списка.
Head - Указатель на голову
списка.
int READonPos(struct List *Head2,int Pos,int
*res)
Читает элемент списка с
заданным номером (нумерация идет с нуля) и помещает значение по адресу res.
Если мы хотим прочитать элемент за
концом списка, то функция возвратит 0, в противном случае - единицу.
Head2 - указатель на голову
списка (0-й элемент).
Pos - номер элемента, который
должен быть прочитан.
res - адрес, куда считывать
информацию.
void
DELall(struct List *Head3)
Уничтожает список полностью.
Head3 - Указатель на голову
списка.
int
Len(struct List *Head4)
Определяет количество
элементов в списке и возвращает его.
Head4 -
указатель на голову списка.
int ADD(struct List **Head5,int New5,int Pos)
Добавляет в список элемент,
который встает в заданную позицию (раздвигая остальные элементы).
Если не удалось выделить память, возвратит 0, если
же все хорошо - 1.
Если заданная позиция больше, чем длина списка,
элемент вставляется в конец списка.
Head5 - указатель на голову
списка.
New5 - источник информации
(откуда идет копирование).
Pos - заданная позиция.
void
DEL(struct List **Head5,int Pos)
Удаляет элемент из списка в
заданной позиции.
Если позиция задана за концом
списка, то удаляется последний элемент.
Head5 - указатель на голову
списка.
Pos - заданная позиция.
REP(struct
List *Head5,int New5,int Pos)
Заменяет элемент в заданной
позиции.
Если позиция больше, чем длина
списка, то заменяется последний элемент.
Head5 - указатель на голову
списка.
New5 - число, которым заменят
число в заданной позиции.
Pos - номер (т.е. заданная
позиция).
struct ListP
{
char
*P;
long
Le;
struct
ListP *next;
};
P - адрес строки.
Le - длина строки (с учетом
нулевого завершающего байта).
next - адрес следующего элемента
списка.
Рисунок:
Эта структура используется, чтобы
хранить в виде списка строки, если заранее не известна их длина (допустим
строки текстового файла). Под каждую строку выделяется Le байт (сколько надо), а в
структуру потом записывается адрес этой строки (то-есть адрес выделенной
памяти).
Членами этого списка в общем случае
могут быть не только символьные строки, но и массивы произвольных байт. Для
того чтобы читать и записывать подобные массивы созданы специальные функции (их название обычно заканчивается на
1).
struct
ListP *SEEKendStrP(struct ListP *Head)
Возвращает указатель на
последний элемент списка.
Head - указатель на головной
(0-й) элемент списка.
struct
ListP *SEEKend_1Str(struct ListP *Head1)
Возвращает указатель на
предпоследний элемент списка.
Если в списке только один элемент,
возвращает NULL.
Head1 - указатель на голову
списка.
struct ListP *CRbegStr(char *source)
Заполняет 0-й элемент списка
информацией из строки, строка заканчивается нулевым байтом (то-есть фактически
создает список и возвращает указатель на его начальный элемент).
source - откуда берется
информация.
struct
ListP1 *CRbegStr(char *source,int N)
Заполняет 0-й элемент списка
информацией из массива, записывая туда N байт (то-есть фактически
создает список и возвращает указатель на его начальный элемент).
source - откуда берется
информация.
N - число байт переносимых в
список.
int
ADDendStrP(struct ListP *Head2,char *source)
Добавляет элемент в конец
существующего списка.
Если не удалось выделить память, возвратит 0, если
же все хорошо - 1.
Head2 - указатель на головной
элемент списка.
int ADDendStrP1(struct ListP *Head2,char
*source,int N)
Добавляет элемент в конец
существующего списка.
Если не удалось выделить память, возвратит 0, если
же все хорошо - 1.
Head2 - указатель на головной
элемент списка.
source - массив, откуда берется
информация.
N - число байт, переносимых в
строку списка.
void
DELendStrP(struct ListP *Head5)
Удаляет элемент из конца
существующего списка.
Head5 - Указатель на голову
списка.
int
READonPosStrP(struct ListP *Head3,int Pos,char *dest)
Читает элемент списка с
заданным номером (нумерация идет с нуля).
Если мы хотим прочитать элемент за
концом списка, то функция возвратит 0, в противном случае - единицу.
Head3 - указатель на голову
списка (0-й элемент).
Pos - номер элемента, который
должен быть прочитан.
res - куда считывать
информацию.
int READonPosStrP1(struct ListP *Head3,int
Pos,char *dest,int N)
Читает элемент списка с
заданным номером (нумерация идет с нуля).
Если мы хотим прочитать элемент за
концом списка, то функция возвратит 0, в противном случае - единицу.
Head3 - указатель на голову
списка (0-й элемент).
Pos - номер элемента, который
должен быть прочитан.
dest - куда считывать
информацию.
N - число байт, переносимых
по адресу dest из списка.
void
DELallStrP(struct ListP *Head3)
Уничтожает список полностью.
Head3 - Указатель на голову
списка.
int
LenStrP(struct ListP *Head4)
Определяет количество
элементов в списке.
Head4 -
указатель на голову списка.
int ADDStrP(struct ListP **Head6,char
*source,int Pos)
Добавляет в список элемент,
который встает в заданную позицию (раздвигая остальные элементы).
Если не удалось выделить память, возвратит 0, если
же все хорошо - 1.
Если заданная позиция больше, чем длина списка,
элемент вставляется в конец списка.
Head6 - указатель на голову
списка.
source - источник информации
(откуда идет копирование) - строка, заканчивающаяся нулевым байтом.
Pos - заданная позиция.
int
ADDStrP1(struct ListP **Head6,char *source,int Pos,int N)
Добавляет в список элемент,
который встает в заданную позицию (раздвигая остальные элементы).
Если не удалось выделить память, возвратит 0, если
же все хорошо - 1.
Если заданная позиция больше, чем длина списка,
элемент вставляется в конец списка.
Head6 - указатель на голову
списка.
source - источник информации
(откуда идет копирование) - массив, не обязательно заканчивающийся нулевым
байтом.
Pos - заданная позиция.
N - число байт, переносимых в
строку списка.
void DELStrP(struct ListP **Head7,int Pos7)
Удаляет элемент из списка в
заданной позиции.
Если позиция задана за концом
списка, то удаляется последний элемент.
Head7 - указатель на голову
списка.
Pos7 - заданная позиция.
REPStrP(struct
ListP *Head8,char source,int Pos8)
Заменяет элемент в заданной
позиции.
Если позиция больше, чем длина
списка, то заменяется последний элемент.
Head8 - указатель на голову
списка.
source - источник информации -
строка, заканчивающаяся нулевым байтом.
Pos8 - номер (т.е. заданная
позиция).
REPStrP1(struct ListP *Head8,char source,int
Pos8,int N)
Заменяет элемент в заданной
позиции.
Если позиция больше, чем длина
списка, то заменяется последний элемент.
Head8 - указатель на голову
списка.
source - источник информации -
массив, не обязательно заканчивающийся нулевым байтом.
Pos8 - номер (т.е. заданная
позиция).
N - число байт, переносимых в
строку списка из массива.
int
CpListToFileP(struct ListP *Head,char *dest)
Копирует список в текстовый
файл (каждая строка заканчивается символами 13 и 10 - как в системе DOS).
Если не удалось выделить память (для своих внутренних целей) - возвращает -1,
если все в порядке - возвращает 0.
Head - указатель на голову
списка.
dest
- имя файла.
long
READonPosLP(struct ListP *Head,int Pos)
Возвращает длину строки (с
учетом нулевого байта, если он записан в строку), на которую указывает указатель
в списке.
struct ListP *TextFileToList(char
*filename1,char *end,long k)
Создает список из строк
текстового файла (считается, что строки текстового файла заканчиваются
содержимым строки end, причем это содержимое в список не записывается).
Если возвращает NULL, значит была какая-то ошибка (в частности длина
строки файла превысила число k).
filename1 - имя текстового файла.
end - строка, на которую
заканчиваются строки текстового файла.
k -
максимальная длина строки текстового файла.
struct
ListP *TextFileToList1(char *filename1,char *end,long k)
Создает список из строк
текстового файла (считается, что строки текстового файла заканчиваются
содержимым строки end, причем это содержимое в список не записывается).
Если возвращает NULL, значит была какая-то ошибка (в частности длина
строки файла превысила число k). Более корректно
обрабатывает конец текстового файла - если файл заканчивается на 13,10 - новая
пустая строка списка после этого не создается.
filename1 - имя текстового файла.
end - строка, на которую
заканчиваются строки текстового файла.
k -
максимальная длина строки текстового файла.
int PAR_s(struct ListP **PP,struct ListP
**PPvar1,int k1)
В каждой строке списка ищет
скобки, потом создает переменную __v(номер), вносит ее в список
вспомогательных переменных и создает строку, где эта новая переменная
приравнивается внутреннему содержимому скобок. Эта строка вставляется в список
перед обрабатываемой, а в обрабатываемой скобки заменяются на новую переменную.
Если в качестве PPvar1
будет фигурировать NULL, то список переменных будет создан.
Операция повторяется со всеми
строками списка (в том числе и с вновь созданными самой функцией), пока не
станет нечего обрабатывать.
Возвращает самый большой номер
вспомогательной переменной.
PP - список обрабатываемых
строк.
PPvar1 - список вспомогательных
переменных.
k1 - номер самой последней из
ранее созданных переменных (создаваемые при работе функции переменные будут
иметь большие номера).
int SIGN_s1(struct ListP **PP,struct ListP **PPvar1,struct
ListP **PPvar2,int k1,char sign)
В каждой строке списка ищет
знак sign, считая его знаком бинарной операции, а также первый знак =. Если знак
= не найден, то возвращает -1. Если знаки +,-,*,/ есть левее знака =,
возвращает
-2.
Потом она выделяет части строки от = до искомого знака и после искомого знака.
Проверяет, входят ли в эти части знаки +,-,*,/. Если да, то функция создает
новую переменную __v(номер), вносит ее в список вспомогательных
переменных и создает строку, где эта новая переменная приравнивается
рассматриваемой части обрабатываемой строки. Эта строка вставляется в список
перед обрабатываемой, а в обрабатываемой та самая часть заменяется на новую
переменную. Если же знаки не входят в рассматриваемую часть, и эта самая часть
не есть число, то создается основная переменная с именем этой части строки и
вносится в соответствующий список.
Возвращает также -6, если перед
первым = ничего не стоит, и
-5,
если перед первым = стоит число.
Операция повторяется со всеми
строками списка (в том числе и с вновь созданными самой функцией), пока не
станет нечего обрабатывать.
Возвращает самый большой номер
вспомогательной переменной.
PP - список обрабатываемых
строк.
PPvar1 - список вспомогательных
переменных.
PPvar2 - список основных переменных.
k1 - номер самой последней из
ранее созданных переменных (создаваемые при работе функции переменные будут
иметь большие номера).
sign - обрабатываемый знак.
int
SIGN_s3(struct ListP **PP,struct ListP **PPvar1,int k1,char sign)
В каждой строке списка ищет
знак последний знак sign, проверяет, является ли он знаком унарной операции,
а также ищет первый знак =. Если знак = не найден, то возвращает -1. Если знаки
+,-,*,/ есть левее знака =, возвращает -2. Потом она выделяет часть строки от
искомого знака до конца строки или до следующего знака из набора +,-,*,/. Если
необходимо, то функция создает новую переменную __v(номер), вносит ее в список
вспомогательных переменных и создает строку, где эта новая переменная
приравнивается рассматриваемой части обрабатываемой строки. Эта строка
вставляется в список перед обрабатываемой, а в обрабатываемой сам знак и
последующая часть строки (до следующего знака) заменяется на новую переменную.
Операция повторяется со всеми
строками списка (в том числе и с вновь созданными самой функцией), пока не
станет нечего обрабатывать.
Возвращает самый большой номер
вспомогательной переменной.
PP - список обрабатываемых
строк.
PPvar1 - список вспомогательных
переменных.
k1 - номер самой последней из
ранее созданных переменных (создаваемые при работе функции переменные будут
иметь большие номера).
sign - обрабатываемый знак.
int SEARCHlistP(struct ListP *H,char *str,int
n0)
Поиск в списке строки,
совпадающей с заданной. Возвращает номер элемента (первого), если он найден. -1
- если элемент не найден. Отрицательное число - отрицательный результат.
H - список.
str - строка для сравнения.
n0 - поиск начнется с этого
члена списка.
void
*GETvarAdr(char *S,struct List *Pvar1,struct ListP *Pvar2,
struct List *Padr1,struct ListP *Padr2)
Ищет имя переменной S в
списках Pvar1 и Pvar2, потом находит в списке Padr1
или, соответственно, Padr2 адрес области памяти,
выделенной под эту переменную, и возвращает его. Если переменная не найдена,
возвращает NULL.
int EXECUTE_2(struct ListP *P,struct ListP
*Pvar1,struct ListP *Pvar2)
Сперва выделяет память под
все переменные - и вспомогательные, и основные.
Далее начинает выполнять строки
списка P. Считается, что все они уже приведены к простейшему виду. Возвращает
-1, если выясняется, что память под переменную не выделена, то-есть ее адрес - NULL.
int
DELsubListP(struct ListP **Head1,int I0,int I1)
Вырезает члены списка от I0 до I1
включительно. Занятая память освобождается. Возвращает 1 в случае успеха.
Если I0<0, то удаление членов
идет от начала Head1 (то-есть от нулевого члена), а если I1>(число
членов в списке-2), то удаляются члены от I0 до последнего.
int
DELsubListPtoEnd(struct ListP **Head1,int I0)
Вырезает члены списка от I0 до конца (включая I0).
Возвращает 1 в случае успеха.
Если I0<0, то удаление членов
идет от начала Head1 (то-есть от нулевого члена).
long
MemP(struct ListP *Head1,int I0,int I1)
Определяет размер памяти, занятой членами списка от I0 до I1
включительно. Возвращает -1 в случае если Head1 - NULL.
Под размером памяти имеется ввиду
размер структуры плюс размер строки.
Если I0<0, то определение
размера занятой памяти идет от начала Head1 (то-есть от нулевого
члена), а если I1>(число членов в списке-2), то от I0 до
последнего.
long
MemPtoEnd(struct ListP *Head1,int I0)
Определяет размер памяти, занятой членами списка от I0 до
конца списка (включая I0). Возвращает -1 в случае
если Head1 - NULL.
Под размером памяти имеется ввиду
размер структуры плюс размер строки.
Если I0<0, то определение
размера занятой памяти идет от начала Head1 (то-есть от нулевого
члена).
struct
ListP *SEEKMemberP(struct ListP *Head1,int Pos)
Возвращает адрес члена
списка с номером Pos.
Если номер слишком велик, то
возвратится NULL. Если же номер меньше нуля, то возвратится
непредсказуемое число.
int
SEARCHlistPLast(struct ListP *H,char *str,int N1)
Ведет поиск строки в списке,
совпадающей с str, от 0 до (N1-1)-й строки списка
(включительно) и возвращает номер ПОСЛЕДНЕЙ найденной строки. Если N1<0,
поиск идет на всем списке (как и если N1 слишком велико больше
(длина списка -2)).
Если строка не найдена, возвратит
-1.
int
CpListToFileP(struct ListP *Head,char *dest)
Копирует список в текстовый
файл (каждая строка заканчивается символами 13 и 10 - как в системе DOS).
Если не удалось выделить память (для своих внутренних целей) - возвращает -1,
если все в порядке - возвращает 0.
Head - указатель на голову
списка.
dest
- имя файла.
int
ADDListEndP(ctruct ListP *Head1,struct ListP *Head2)
Прицепляет список Head1 в
конец списка Head2. В случае успеха возвращает 1.
Head1 - указатель на список,
который прицепляют.
Head2 - указатель на список, к
которому прицепляют первый список.
int
ADDListP(ctruct ListP *Head1,struct ListP *Head2,int I)
Вставляет список Head1
ПОСЛЕ позиции I в список Head2. Все остальные члены
«раздвигаются». В случае успеха возвращает 1. Если засланы значения NULL,
возвращается 0.
int ADDListPbefore(ctruct ListP *Head1,struct ListP **Head2,int I)
Вставляет список Head1 В
ПОЗИЦИЮ I в список Head2. Все остальные члены
«раздвигаются». В случае успеха возвращает 1. Если засланы значения NULL,
возвращается 0.
struct
ListP *CpListP(struct ListP *Head1,int I0,int I1)
Создает новый список, копируя туда члены списка от I0 до I1
включительно и возвращая указатель на этот новый список.
Если I0<0, то копирование идет
от начала Head1 (то-есть от нулевого члена), а если I1>(число
членов в списке-2), то копируются члены от I0 до последнего.
struct
ListP *CpListPtoEnd(struct ListP *Head1,int I0)
Создает новый список, копируя туда члены списка от I0 до
конца списка I1 (включая I0) и возвращая указатель на
этот новый список.
Если I0<0, то копирование идет
от начала Head1 (то-есть от нулевого члена).
int
DELsubListP(struct ListP **Head1,int I0,int I1)
Вырезает члены списка от I0 до I1
включительно. Занятая память освобождается. Возвращает 1 в случае успеха.
Если I0<0, то удаление членов
идет от начала Head1 (то-есть от нулевого члена), а если I1>(число
членов в списке-2), то удаляются члены от I0 до последнего.
int
DELsubListPtoEnd(struct ListP **Head1,int I0)
Вырезает члены списка от I0 до конца (включая I0).
Возвращает 1 в случае успеха.
Если I0<0, то удаление членов
идет от начала Head1 (то-есть от нулевого члена).