compile, step 또는 advance 서브루틴
용도
정규식 패턴을 컴파일하고 일치시킵니다.
라이브러리
표준 C 라이브러리(libc.a)
구문
#define INIT declarations
#define GETC( ) getc_code
#define PEEKC( ) peekc_code
#define UNGETC(c) ungetc_code
#define RETURN(pointer) return_code
#define ERROR(val) error_code설명
/usr/include/regexp.h 파일에는 정규식 패턴 일치를 수행하는 서브루틴이 포함되어 있습니다. 정규식 패턴 일치를 수행하는 프로그램은 이 소스 파일을 사용합니다. 따라서 프로그램 간 정규식 호환성을 유지하기 위해 regexp.h 파일만 변경하면 됩니다.
이 파일에 대한 인터페이스는 복잡합니다. 이 파일을 포함하는 프로그램은 #include <regexpregexp.h 문 앞에 다음 6개의 매크로를 정의합니다. 이러한 매크로는 컴파일 서브루틴에서 사용됩니다:
| 항목 | 설명 |
|---|---|
| INIT | 이 매크로는 종속 선언 및 초기화에 사용됩니다. 컴파일 서브루틴의 선언과 {(왼쪽 중괄호) 열기 바로 뒤에 배치됩니다. INIT 버퍼의 정의는 ;(세미콜론)으로 끝나야 합니다. INIT는 정규식의 시작을 가리키도록 레지스터 변수를 설정하는 데 자주 사용되며, 이 레지스터 변수는 GETC, PEEKC 및 UNGETC 매크로의 선언에서 사용할 수 있습니다. 그렇지 않으면 INIT를 사용하여 GETC, PEEKC 및 UNGETC에 필요한 외부 변수를 선언할 수 있습니다. |
| GETC( ) | 이 매크로는 정규식 패턴의 다음 문자 값을 반환합니다. GETC 매크로를 연속적으로 호출하면 패턴의 연속 문자가 반환되어야 합니다. |
| PEEKC( ) | 이 매크로는 정규식의 다음 문자를 반환합니다. PEEKC 매크로를 연속적으로 호출하면 동일한 문자가 반환되어야 하며, 이 문자는 GETC 매크로에서 반환되는 다음 문자이기도 해야 합니다. |
| UNGETC(c) | 이 매크로를 사용하면 다음번 GETC 및 PEEKC 매크로 호출 시 매개변수 c가 반환됩니다. 푸시백은 한 글자 이상 필요하지 않으며, 이 문자는 GETC 매크로에서 읽은 마지막 문자가 되도록 보장됩니다. UNGETC 매크로의 반환 값은 항상 무시됩니다. |
| RETURN(포인터) | 이 매크로는 컴파일 서브루틴을 정상적으로 종료하는 데 사용됩니다. 포인터 매개변수는 컴파일된 정규식 바로 뒤의 첫 번째 문자를 가리킵니다. 이는 관리할 메모리 할당이 있는 프로그램에 유용합니다. |
| ERROR(val) | 이 매크로는 컴파일 서브루틴에서 비정상적으로 종료할 때 사용됩니다. 반환 문을 포함하지 않아야 합니다. Val 매개변수는 오류 번호입니다. 오류 값과 그 의미는 다음과 같습니다:
|
컴파일 서브루틴은 나중에 사용할 수 있도록 정규식을 컴파일합니다. 컴파일 서브루틴에서 InString 매개변수를 명시적으로 사용하지는 않지만 매크로에서 사용할 수 있습니다. 예를 들어 컴파일 서브루틴을 사용하여 패턴이 포함된 문자열을 InString 매개변수로 전달하여 컴파일하고 INIT 매크로를 사용하여 이 문자열의 시작 부분에 대한 포인터를 설정할 수 있습니다. 예제 섹션의 예시에서는 이 기법을 사용합니다. 매크로에서 InString을 사용하지 않는 경우 이 매개변수에 대해 ((문자 *) 0) 값을 사용하여 컴파일을 호출합니다.
ExpBuffer 매개변수는 컴파일된 정규식을 배치할 문자 배열을 가리킵니다. EndBuffer 매개변수는 컴파일된 정규식을 배치할 문자 배열 바로 뒤의 위치를 가리킵니다. 컴파일된 표현식이(EndBuffer-ExpBuffer) 바이트에 맞지 않으면 ERROR(50)이 호출됩니다.
EndOfFile 매개변수는 정규식의 끝을 표시하는 문자입니다. 예를 들어, ed 명령에서 이 문자는 일반적으로 /(슬래시)입니다.
regexp.h 파일은 실제 정규식 패턴 일치를 수행하는 다른 서브루틴을 정의합니다. 이 중 하나가 스텝 서브루틴입니다.
단계 하위 루틴의 String 매개 변수는 일치 여부를 검사할 널로 끝나는 문자 문자열에 대한 포인터입니다.
Expbuffer 매개변수는 컴파일 서브루틴을 호출하여 얻은 컴파일된 정규식을 가리킵니다.
단계 하위 루틴은 주어진 문자열이 패턴과 일치하면 1 값을 반환하고, 일치하지 않으면 0을 반환합니다. 패턴이 일치하면 단계는 두 개의 전역 문자 포인터, 즉 패턴과 일치하는 첫 번째 문자를 가리키는 loc1 패턴과 일치하는 마지막 문자 바로 뒤의 문자를 가리키는 loc2 설정합니다. 따라서 정규식이 전체 문자열과 일치하는 경우 loc1 문자열 매개변수의 첫 번째 문자를 가리키고 loc2 문자열 매개변수 끝에 있는 null 문자를 가리킵니다.
단계 서브루틴은 정규식이 ^(곡선)으로 시작하는 경우 컴파일 서브루틴에서 설정하는 전역 변수 circf를 사용합니다. 이 변수가 설정되어 있으면 단계는 정규식을 문자열의 시작 부분에만 일치시키려고 시도합니다. 첫 번째 정규식을 실행하기 전에 둘 이상의 정규식을 컴파일하는 경우, 컴파일된 각 정규식에 대해 circf 값을 저장하고 각 단계 호출 전에 circf를 저장된 값으로 설정합니다.
단계 하위 루틴은 전달된 것과 동일한 매개 변수를 사용하여 advance라는 이름의 하위 루틴을 호출합니다. 단계 함수는 문자열 매개변수를 통해 증가하며 일치를 나타내는 1을 반환할 때까지 또는 문자열의 끝에 도달할 때까지 진행 서브루틴을 호출합니다. 모든 경우에 문자열 매개 변수를 문자열의 시작 부분으로 제한하려면 단계 하위 루틴을 호출하는 대신 고급 하위 루틴을 직접 호출합니다.
전진 서브루틴이 정규식에서 *(별표) 또는 \{{ \} 시퀀스를 발견하면 일치시킬 문자열에 대한 포인터를 최대한 전진시키고 자신을 재귀적으로 호출하여 나머지 문자열을 정규식의 나머지 부분과 일치시키려고 시도합니다. 일치하는 항목이 없는 한, 사전 서브루틴은 일치하는 항목을 찾거나 * 또는 \{{ \} 처음 일치하는 문자열의 지점에 도달할 때까지 문자열을 따라 백업합니다. 문자열의 초기 지점에 도달하기 전에 이 백업을 중지할 수 있습니다. 백업 프로세스 중 언젠가 locs 전역 문자가 문자열의 지점과 같으면 사전 서브루틴이 백업 루프에서 벗어나 0을 반환합니다. 이것은 전체 줄에서 전역 대체에 사용되므로 다음과 같은 표현식이 가능합니다s/y*//g영원히 반복하지 마십시오.
매개변수
| 항목 | 설명 |
|---|---|
| InString | 컴파일할 패턴이 포함된 문자열을 지정합니다. InString 매개변수는 컴파일 서브루틴에서 명시적으로 사용되지는 않지만 매크로에서 사용될 수 있습니다. |
| ExpBuffer | 컴파일된 정규식을 배치할 문자 배열을 가리킵니다. |
| EndBuffer | 컴파일된 정규식을 배치할 문자 배열 바로 뒤의 위치를 가리킵니다. |
| EndOfFile | 정규식의 끝을 표시하는 문자를 지정합니다. |
| 문자열 | 일치 여부를 확인할 널로 끝나는 문자 문자열을 가리킵니다. |
예
다음은 정규식 매크로 및 호출의 예입니다:
#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>
. . .
compile (patstr,expbuf, &expbuf[ESIZE], '\0');
. . .
if (step (linebuf, expbuf))
succeed( );
. . .