Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

REGEXP(5)

НАЗВАНИЕ
regexp - функции для компиляции и сопоставления регу лярных выражений

СИНТАКСИС


        #define INIT      описания

        #define GETC( )   реализация_GETC

        #define PEEKC( )  реализация_PEEKC

        #define UNGETC(c) реализация_UNGETC

        #define RETURN(p) реализация_RETURN

        #define ERROR(v)  реализация_ERROR



        #include <regexp.h>



        char *compile (instring, expbuf, endbuf, eof)

        char *instring, *expbuf, *endbuf;

        int eof;



        int step (string, expbuf)

        char *string, *expbuf;



        extern char *loc1, *loc2, *locs;



        extern int circf, sed, nbra;

ОПИСАНИЕ
В данной статье описываются универсальные функции сопоставления регулярных выражений в форме ed(1), определенные во включаемом файле <regexp.h>. Этот исходный файл используется такими программами, как ed(1), sed(1), grep(1), bs(1) и expr(1), которые выполняют сопоставление регулярных выражений. Тем самым обеспечивается согласованная трактовка регулярных выражений.

У этого файла неприятный интерфейс. Программы, которые включают данный файл, перед оператором #include <regexp.h> должны содержать определение пяти макросов, перечисленных ниже. Макросы используются функцией compile.

GETC( )
Возвращает значение следующего символа в регулярном выражении. Последовательные вызовы GETC будут возвращать последовательные символы регулярного выражения.
PEEKC( )
Возвращает следующий символ в регулярном выражении. Последовательные вызовы PEEKC возвращают один и тот же символ (данный символ будет возвращен и при следующем вызове GETC).
UNGETC(c)
Обеспечивает, чтобы символ c был выдан при следующем вызове GETC (и PEEKC). Оговаривается, что не делается попыток вернуть подряд более одного символа, и этот символ является последним, прочитанным GETC. Значение макроса UNGETC игнорируется.
RETURN(p)
Данный макрос используется при нормальном завершении функции compile. Значение аргумента p - указатель на символ, следующий за последним символом скомпилированного регулярного выражения. Это полезно для программ, которые должны заниматься распределением памяти.
ERROR(v)
Аварийное завершение функции compile. Аргумент v - это код ошибки. Возврата из данного макроса быть не должно. Коды ошибок:
КодТолкование
11Верхняя граница диапазона слишком велика.
16Некорректное число.
25"\цифра" вне диапазона.
36Некорректный или отсутствующий разделитель.
41Нет запомненной цепочки символов для поиска.
42Не сбалансированы скобки \( и \).
43Слишком много открывающих скобок \(.
44В скобках \{ \} указано больше двух чисел.
45Фигурная скобка } ожидалась после \.
46В скобках \{ \} первое число больше второго.
49Не сбалансированы скобки [ и ].
50Переполнение регулярного выражения.
Обращение к функции compile выглядит так:

 compile (instring, expbuf, endbuf, eof)

Первый аргумент instring никогда не используется функцией compile явно, но бывает удобен для программ, которые передают различные указатели на входные символы. Иногда он используется в описаниях INIT (см. ниже). Программы, которые получают символы посредством вызовов функций или хранят их во внешнем массиве, могут передавать в качестве этого аргумента значение ((char *) 0).

Аргумент expbuf - указатель на символ. Он определяет позицию, начиная с которой должно быть размещено скомпилированное регулярное выражение.

Аргумент endbuf на единицу превосходит максимальную позицию, в которой может быть размещено регулярное выражение. Если скомпилированное выражение не умещается в (endbuf-expbuf) байт, выполняется вызов ERROR (50).

Аргумент eof - это символ, который отмечает конец регулярного выражения. Например, в ed(1) этим символом обычно является /.

В каждой программе, которая включает файл <regexp.h>, должен быть оператор #define для имени INIT. Заданные в нем описания будут размещены в самом начале функции compile. Чаще всего макрос INIT служит для того, чтобы установить регистровую переменную на начало регулярного выражения с целью последующего использования в GETC, PEEKC и UNGETC. Кроме того, в INIT можно описать внешние переменные, используемые макросами GETC, PEEKC и UNGETC. См. ниже пример описаний, взятый из grep(1).

В файле <regexp.h> есть и другие функции, которые фактически выполняют сопоставление регулярных выражений; одна из них - функция step. Обращение к ней выглядит так:


 step (string, expbuf)

Первый аргумент функции step - указатель на цепочку символов, для которой надо проверить возможность сопоставления. Эта цепочка должна быть ограничена нулевым байтом.

Второй аргумент, expbuf, - скомпилированное регулярное выражение, полученное при помощи функции compile.

Функция step возвращает ненулевое значение, если данная цепочка сопоставляется с регулярным выражением, и 0 в противном случае. Если сопоставление имеет место, побочный эффект функции step заключается в установке двух внешних указателей. Переменная loc1, устанавливаемая функцией step, является указателем на первый сопоставленный символ. Переменная loc2, которая устанавливается функцией advance, указывает на символ, следующий за последним сопоставленным символом. Таким образом, если с регулярным выражением сопоставилась вся цепочка, то loc1 будет указывать на первый символ string, а loc2 - на нулевой байт в конце string.

Функция step использует внешнюю переменную circf. Compile присваивает этой переменной ненулевое значение, если регулярное выражение начинается с ^; в таком случае step будет пытаться выполнять сопоставление только с начала цепочки символов. Если до первой попытки сопоставления откомпилировано более одного регулярного выражения, следует сохранить для каждого скомпилированного выражения значение circf и восстанавливать значение этой переменной перед каждым вызовом step.

Функция advance вызывается из step с теми же аргументами, что и step. Задача функции step - передвигать указатель string на символ вперед и вызывать advance; step выполняется до тех пор, пока либо advance не возвратит ненулевое значение, что обозначает сопоставление, либо не будет достигнут конец string. Если хотят в любом случае ограничиться сопоставлением с начала цепочки string, step не вызывают, а просто используют advance.

Если функция advance встречает в регулярном выражении * или последовательность \{ \}, она, выполняя сопоставление, продвигает указатель на цепочку символов, насколько это возможно, и рекурсивно вызывает сама себя, пытаясь сопоставить остаток цепочки с остатком регулярного выражения. Если при этом сопоставление не выполнится, advance будет возвращаться вдоль цепочки, пока не обнаружит сопоставления либо не вернется к позиции в цепочке символов, с которой первоначально было сопоставлено * или \{ \}. Иногда желательно остановить этот возврат назад до того, как будет достигнуто начало цепочки. Если locs - внешний указатель на символ - в некоторый момент процесса возврата станет равен позиции в цепочке символов, advance прервет цикл возврата и завершится с результатом 0. Эта возможность используется программами ed(1) и sed(1) при выполнении глобальной подстановки (то есть не для первого вхождения, а для всей цепочки); например, при обработке выражений типа /y*//g не возникнет бесконечного цикла.

ПРИМЕР
Следующий пример показывает, как выглядят предназначенные для работы с регулярными выражениями макросы и функции, которые используются в grep(1):


#define INIT      register char *sp = instring;

#define GETC()    (*sp++)

#define PEEKC()   (*sp)

#define UNGETC(c) (--sp)

#define RETURN(c) return;

#define ERROR(c)  regerr()



#include <regexp.h>

 ...

(void) compile (*argv, expbuf, &expbuf[ESIZE], '\0');

 ...

if (step(linebuf, expbuf))

 succeed();

СМ. ТАКЖЕ
ed(1), expr(1), grep(1), sed(1) в Справочнике пользователя.

R_PCRWORD
Двухбайтное смещение относительно счетчика команд.
R_PCRLONG
Четырехбайтное смещение относительно счетчика команд.

Существуют другие типы ссылок для иных процессоров. Одинаковые типы ссылок на разных процессорах имеют одинаковые номера и смысл. Если возникнет необходимость в новых типах ссылок, то можно будет их добавить с новыми номерами.

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

СМ. ТАКЖЕ
a.out(4), syms(4).
as(1), ld(1) в Справочнике пользователя.

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...