doc
This commit is contained in:
@@ -37,26 +37,46 @@
|
||||
* @(#)cclass.h 8.3 (Berkeley) 3/20/94
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file cclass.h
|
||||
*
|
||||
* @brief Regexp character classes.
|
||||
*
|
||||
* @namespace regexp
|
||||
*
|
||||
*/
|
||||
|
||||
typedef enum {CALNUM, CALPHA, CBLANK, CCNTRL, CDIGIT, CGRAPH,
|
||||
CLOWER, CPRINT, CPUNCT, CSPACE, CUPPER, CXDIGIT} citype;
|
||||
typedef enum {
|
||||
CALNUM,
|
||||
CALPHA,
|
||||
CBLANK,
|
||||
CCNTRL,
|
||||
CDIGIT,
|
||||
CGRAPH,
|
||||
CLOWER,
|
||||
CPRINT,
|
||||
CPUNCT,
|
||||
CSPACE,
|
||||
CUPPER,
|
||||
CXDIGIT
|
||||
} citype;
|
||||
|
||||
/* character-class table */
|
||||
static struct cclass {
|
||||
char *name;
|
||||
citype fidx;
|
||||
} cclasses[] = {
|
||||
{"alnum", CALNUM},
|
||||
{"alpha", CALPHA},
|
||||
{"blank", CBLANK},
|
||||
{"cntrl", CCNTRL},
|
||||
{"digit", CDIGIT},
|
||||
{"graph", CGRAPH},
|
||||
{"lower", CLOWER},
|
||||
{"print", CPRINT},
|
||||
{"punct", CPUNCT},
|
||||
{"space", CSPACE},
|
||||
{"upper", CUPPER},
|
||||
{"xdigit", CXDIGIT},
|
||||
{NULL, }
|
||||
};
|
||||
char *name;
|
||||
citype fidx;
|
||||
} cclasses[] = {{"alnum", CALNUM},
|
||||
{"alpha", CALPHA},
|
||||
{"blank", CBLANK},
|
||||
{"cntrl", CCNTRL},
|
||||
{"digit", CDIGIT},
|
||||
{"graph", CGRAPH},
|
||||
{"lower", CLOWER},
|
||||
{"print", CPRINT},
|
||||
{"punct", CPUNCT},
|
||||
{"space", CSPACE},
|
||||
{"upper", CUPPER},
|
||||
{"xdigit", CXDIGIT},
|
||||
{
|
||||
NULL,
|
||||
}};
|
||||
|
@@ -37,105 +37,112 @@
|
||||
* @(#)cname.h 8.3 (Berkeley) 3/20/94
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file cname.h
|
||||
*
|
||||
* Vharacter names.
|
||||
*
|
||||
* @namespace regexp
|
||||
*
|
||||
*/
|
||||
|
||||
/* character-name table */
|
||||
static struct cname {
|
||||
char *name;
|
||||
char code;
|
||||
} cnames[] = {
|
||||
{"NUL", '\0'},
|
||||
{"SOH", '\001'},
|
||||
{"STX", '\002'},
|
||||
{"ETX", '\003'},
|
||||
{"EOT", '\004'},
|
||||
{"ENQ", '\005'},
|
||||
{"ACK", '\006'},
|
||||
{"BEL", '\007'},
|
||||
{"alert", '\007'},
|
||||
{"BS", '\010'},
|
||||
{"backspace", '\b'},
|
||||
{"HT", '\011'},
|
||||
{"tab", '\t'},
|
||||
{"LF", '\012'},
|
||||
{"newline", '\n'},
|
||||
{"VT", '\013'},
|
||||
{"vertical-tab", '\v'},
|
||||
{"FF", '\014'},
|
||||
{"form-feed", '\f'},
|
||||
{"CR", '\015'},
|
||||
{"carriage-return", '\r'},
|
||||
{"SO", '\016'},
|
||||
{"SI", '\017'},
|
||||
{"DLE", '\020'},
|
||||
{"DC1", '\021'},
|
||||
{"DC2", '\022'},
|
||||
{"DC3", '\023'},
|
||||
{"DC4", '\024'},
|
||||
{"NAK", '\025'},
|
||||
{"SYN", '\026'},
|
||||
{"ETB", '\027'},
|
||||
{"CAN", '\030'},
|
||||
{"EM", '\031'},
|
||||
{"SUB", '\032'},
|
||||
{"ESC", '\033'},
|
||||
{"IS4", '\034'},
|
||||
{"FS", '\034'},
|
||||
{"IS3", '\035'},
|
||||
{"GS", '\035'},
|
||||
{"IS2", '\036'},
|
||||
{"RS", '\036'},
|
||||
{"IS1", '\037'},
|
||||
{"US", '\037'},
|
||||
{"space", ' '},
|
||||
{"exclamation-mark", '!'},
|
||||
{"quotation-mark", '"'},
|
||||
{"number-sign", '#'},
|
||||
{"dollar-sign", '$'},
|
||||
{"percent-sign", '%'},
|
||||
{"ampersand", '&'},
|
||||
{"apostrophe", '\''},
|
||||
{"left-parenthesis", '('},
|
||||
{"right-parenthesis", ')'},
|
||||
{"asterisk", '*'},
|
||||
{"plus-sign", '+'},
|
||||
{"comma", ','},
|
||||
{"hyphen", '-'},
|
||||
{"hyphen-minus", '-'},
|
||||
{"period", '.'},
|
||||
{"full-stop", '.'},
|
||||
{"slash", '/'},
|
||||
{"solidus", '/'},
|
||||
{"zero", '0'},
|
||||
{"one", '1'},
|
||||
{"two", '2'},
|
||||
{"three", '3'},
|
||||
{"four", '4'},
|
||||
{"five", '5'},
|
||||
{"six", '6'},
|
||||
{"seven", '7'},
|
||||
{"eight", '8'},
|
||||
{"nine", '9'},
|
||||
{"colon", ':'},
|
||||
{"semicolon", ';'},
|
||||
{"less-than-sign", '<'},
|
||||
{"equals-sign", '='},
|
||||
{"greater-than-sign", '>'},
|
||||
{"question-mark", '?'},
|
||||
{"commercial-at", '@'},
|
||||
{"left-square-bracket", '['},
|
||||
{"backslash", '\\'},
|
||||
{"reverse-solidus", '\\'},
|
||||
{"right-square-bracket",']'},
|
||||
{"circumflex", '^'},
|
||||
{"circumflex-accent", '^'},
|
||||
{"underscore", '_'},
|
||||
{"low-line", '_'},
|
||||
{"grave-accent", '`'},
|
||||
{"left-brace", '{'},
|
||||
{"left-curly-bracket", '{'},
|
||||
{"vertical-line", '|'},
|
||||
{"right-brace", '}'},
|
||||
{"right-curly-bracket", '}'},
|
||||
{"tilde", '~'},
|
||||
{"DEL", '\177'},
|
||||
{NULL, 0}
|
||||
};
|
||||
char *name;
|
||||
char code;
|
||||
} cnames[] = {{"NUL", '\0'},
|
||||
{"SOH", '\001'},
|
||||
{"STX", '\002'},
|
||||
{"ETX", '\003'},
|
||||
{"EOT", '\004'},
|
||||
{"ENQ", '\005'},
|
||||
{"ACK", '\006'},
|
||||
{"BEL", '\007'},
|
||||
{"alert", '\007'},
|
||||
{"BS", '\010'},
|
||||
{"backspace", '\b'},
|
||||
{"HT", '\011'},
|
||||
{"tab", '\t'},
|
||||
{"LF", '\012'},
|
||||
{"newline", '\n'},
|
||||
{"VT", '\013'},
|
||||
{"vertical-tab", '\v'},
|
||||
{"FF", '\014'},
|
||||
{"form-feed", '\f'},
|
||||
{"CR", '\015'},
|
||||
{"carriage-return", '\r'},
|
||||
{"SO", '\016'},
|
||||
{"SI", '\017'},
|
||||
{"DLE", '\020'},
|
||||
{"DC1", '\021'},
|
||||
{"DC2", '\022'},
|
||||
{"DC3", '\023'},
|
||||
{"DC4", '\024'},
|
||||
{"NAK", '\025'},
|
||||
{"SYN", '\026'},
|
||||
{"ETB", '\027'},
|
||||
{"CAN", '\030'},
|
||||
{"EM", '\031'},
|
||||
{"SUB", '\032'},
|
||||
{"ESC", '\033'},
|
||||
{"IS4", '\034'},
|
||||
{"FS", '\034'},
|
||||
{"IS3", '\035'},
|
||||
{"GS", '\035'},
|
||||
{"IS2", '\036'},
|
||||
{"RS", '\036'},
|
||||
{"IS1", '\037'},
|
||||
{"US", '\037'},
|
||||
{"space", ' '},
|
||||
{"exclamation-mark", '!'},
|
||||
{"quotation-mark", '"'},
|
||||
{"number-sign", '#'},
|
||||
{"dollar-sign", '$'},
|
||||
{"percent-sign", '%'},
|
||||
{"ampersand", '&'},
|
||||
{"apostrophe", '\''},
|
||||
{"left-parenthesis", '('},
|
||||
{"right-parenthesis", ')'},
|
||||
{"asterisk", '*'},
|
||||
{"plus-sign", '+'},
|
||||
{"comma", ','},
|
||||
{"hyphen", '-'},
|
||||
{"hyphen-minus", '-'},
|
||||
{"period", '.'},
|
||||
{"full-stop", '.'},
|
||||
{"slash", '/'},
|
||||
{"solidus", '/'},
|
||||
{"zero", '0'},
|
||||
{"one", '1'},
|
||||
{"two", '2'},
|
||||
{"three", '3'},
|
||||
{"four", '4'},
|
||||
{"five", '5'},
|
||||
{"six", '6'},
|
||||
{"seven", '7'},
|
||||
{"eight", '8'},
|
||||
{"nine", '9'},
|
||||
{"colon", ':'},
|
||||
{"semicolon", ';'},
|
||||
{"less-than-sign", '<'},
|
||||
{"equals-sign", '='},
|
||||
{"greater-than-sign", '>'},
|
||||
{"question-mark", '?'},
|
||||
{"commercial-at", '@'},
|
||||
{"left-square-bracket", '['},
|
||||
{"backslash", '\\'},
|
||||
{"reverse-solidus", '\\'},
|
||||
{"right-square-bracket", ']'},
|
||||
{"circumflex", '^'},
|
||||
{"circumflex-accent", '^'},
|
||||
{"underscore", '_'},
|
||||
{"low-line", '_'},
|
||||
{"grave-accent", '`'},
|
||||
{"left-brace", '{'},
|
||||
{"left-curly-bracket", '{'},
|
||||
{"vertical-line", '|'},
|
||||
{"right-brace", '}'},
|
||||
{"right-curly-bracket", '}'},
|
||||
{"tilde", '~'},
|
||||
{"DEL", '\177'},
|
||||
{NULL, 0}};
|
||||
|
@@ -44,6 +44,14 @@
|
||||
* of code.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file engine.c
|
||||
*
|
||||
* regex interpeter.
|
||||
*
|
||||
* @namespace regexp
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef HAVE_REGEXEC
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -41,13 +41,22 @@
|
||||
static char sccsid[] = "@(#)regerror.c 8.4 (Berkeley) 3/20/94";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
/**
|
||||
* @file regerror.c
|
||||
*
|
||||
* @brief Error handling.
|
||||
*
|
||||
* @namespace regexp
|
||||
*
|
||||
*/
|
||||
|
||||
#include "YapInterface.h"
|
||||
#include "yapregex.h"
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
@@ -57,7 +66,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
/* === regerror.c === */
|
||||
static char * regatoi(const regex_t *preg, char *localbuf);
|
||||
static char *regatoi(const regex_t *preg, char *localbuf);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
@@ -84,91 +93,86 @@ static char * regatoi(const regex_t *preg, char *localbuf);
|
||||
= #define REG_ITOA 0400 // convert number to name (!)
|
||||
*/
|
||||
static struct rerr {
|
||||
int code;
|
||||
char *name;
|
||||
char *explain;
|
||||
} rerrs[] = {
|
||||
{REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match"},
|
||||
{REG_BADPAT, "REG_BADPAT", "invalid regular expression"},
|
||||
{REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element"},
|
||||
{REG_ECTYPE, "REG_ECTYPE", "invalid character class"},
|
||||
{REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)"},
|
||||
{REG_ESUBREG, "REG_ESUBREG", "invalid backreference number"},
|
||||
{REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced"},
|
||||
{REG_EPAREN, "REG_EPAREN", "parentheses not balanced"},
|
||||
{REG_EBRACE, "REG_EBRACE", "braces not balanced"},
|
||||
{REG_BADBR, "REG_BADBR", "invalid repetition count(s)"},
|
||||
{REG_ERANGE, "REG_ERANGE", "invalid character range"},
|
||||
{REG_ESPACE, "REG_ESPACE", "out of memory"},
|
||||
{REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid"},
|
||||
{REG_EMPTY, "REG_EMPTY", "empty (sub)expression"},
|
||||
{REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug"},
|
||||
{REG_INVARG, "REG_INVARG", "invalid argument to regex routine"},
|
||||
{0, "", "*** unknown regexp error code ***"}
|
||||
};
|
||||
int code;
|
||||
char *name;
|
||||
char *explain;
|
||||
} rerrs[] = {{REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match"},
|
||||
{REG_BADPAT, "REG_BADPAT", "invalid regular expression"},
|
||||
{REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element"},
|
||||
{REG_ECTYPE, "REG_ECTYPE", "invalid character class"},
|
||||
{REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)"},
|
||||
{REG_ESUBREG, "REG_ESUBREG", "invalid backreference number"},
|
||||
{REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced"},
|
||||
{REG_EPAREN, "REG_EPAREN", "parentheses not balanced"},
|
||||
{REG_EBRACE, "REG_EBRACE", "braces not balanced"},
|
||||
{REG_BADBR, "REG_BADBR", "invalid repetition count(s)"},
|
||||
{REG_ERANGE, "REG_ERANGE", "invalid character range"},
|
||||
{REG_ESPACE, "REG_ESPACE", "out of memory"},
|
||||
{REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid"},
|
||||
{REG_EMPTY, "REG_EMPTY", "empty (sub)expression"},
|
||||
{REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug"},
|
||||
{REG_INVARG, "REG_INVARG", "invalid argument to regex routine"},
|
||||
{0, "", "*** unknown regexp error code ***"}};
|
||||
|
||||
/*
|
||||
- regerror - the interface to error numbers
|
||||
= extern size_t regerror(int, const regex_t *, char *, size_t);
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
size_t
|
||||
yap_regerror(int errcode,const regex_t *preg,char *errbuf,size_t errbuf_size)
|
||||
{
|
||||
register struct rerr *r;
|
||||
register size_t len;
|
||||
register int target = errcode &~ REG_ITOA;
|
||||
register char *s;
|
||||
char convbuf[50];
|
||||
size_t yap_regerror(int errcode, const regex_t *preg, char *errbuf,
|
||||
size_t errbuf_size) {
|
||||
register struct rerr *r;
|
||||
register size_t len;
|
||||
register int target = errcode & ~REG_ITOA;
|
||||
register char *s;
|
||||
char convbuf[50];
|
||||
|
||||
if (errcode == REG_ATOI)
|
||||
s = regatoi(preg, convbuf);
|
||||
else {
|
||||
for (r = rerrs; r->code != 0; r++)
|
||||
if (r->code == target)
|
||||
break;
|
||||
if (errcode == REG_ATOI)
|
||||
s = regatoi(preg, convbuf);
|
||||
else {
|
||||
for (r = rerrs; r->code != 0; r++)
|
||||
if (r->code == target)
|
||||
break;
|
||||
|
||||
if (errcode®_ITOA) {
|
||||
if (r->code != 0)
|
||||
(void) strcpy(convbuf, r->name);
|
||||
else
|
||||
sprintf(convbuf, "REG_0x%x", target);
|
||||
assert(strlen(convbuf) < sizeof(convbuf));
|
||||
s = convbuf;
|
||||
} else
|
||||
s = r->explain;
|
||||
}
|
||||
if (errcode & REG_ITOA) {
|
||||
if (r->code != 0)
|
||||
(void)strcpy(convbuf, r->name);
|
||||
else
|
||||
sprintf(convbuf, "REG_0x%x", target);
|
||||
assert(strlen(convbuf) < sizeof(convbuf));
|
||||
s = convbuf;
|
||||
} else
|
||||
s = r->explain;
|
||||
}
|
||||
|
||||
len = strlen(s) + 1;
|
||||
if (errbuf_size > 0) {
|
||||
if (errbuf_size > len)
|
||||
(void) strcpy(errbuf, s);
|
||||
else {
|
||||
(void) strncpy(errbuf, s, errbuf_size-1);
|
||||
errbuf[errbuf_size-1] = '\0';
|
||||
}
|
||||
}
|
||||
len = strlen(s) + 1;
|
||||
if (errbuf_size > 0) {
|
||||
if (errbuf_size > len)
|
||||
(void)strcpy(errbuf, s);
|
||||
else {
|
||||
(void)strncpy(errbuf, s, errbuf_size - 1);
|
||||
errbuf[errbuf_size - 1] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
return(len);
|
||||
return (len);
|
||||
}
|
||||
|
||||
/*
|
||||
- regatoi - internal routine to implement REG_ATOI
|
||||
== static char *regatoi(const regex_t *preg, char *localbuf);
|
||||
*/
|
||||
static char *
|
||||
regatoi(preg, localbuf)
|
||||
const regex_t *preg;
|
||||
static char *regatoi(preg, localbuf) const regex_t *preg;
|
||||
char *localbuf;
|
||||
{
|
||||
register struct rerr *r;
|
||||
register struct rerr *r;
|
||||
|
||||
for (r = rerrs; r->code != 0; r++)
|
||||
if (strcmp(r->name, preg->re_endp) == 0)
|
||||
break;
|
||||
if (r->code == 0)
|
||||
return("0");
|
||||
for (r = rerrs; r->code != 0; r++)
|
||||
if (strcmp(r->name, preg->re_endp) == 0)
|
||||
break;
|
||||
if (r->code == 0)
|
||||
return ("0");
|
||||
|
||||
sprintf(localbuf, "%d", r->code);
|
||||
return(localbuf);
|
||||
sprintf(localbuf, "%d", r->code);
|
||||
return (localbuf);
|
||||
}
|
||||
|
@@ -1,19 +1,26 @@
|
||||
/*************************************************************************
|
||||
* *
|
||||
* YAP Prolog *
|
||||
* *
|
||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||
* *
|
||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||
* *
|
||||
**************************************************************************
|
||||
* *
|
||||
* File: regexp.c *
|
||||
* Last rev: *
|
||||
* mods: *
|
||||
* comments: regular expression interpreter *
|
||||
* *
|
||||
*************************************************************************/
|
||||
* *
|
||||
* YAP Prolog *
|
||||
* *
|
||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||
* *
|
||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||
* *
|
||||
**************************************************************************
|
||||
* *
|
||||
* File: regexp.c * Last rev:
|
||||
** mods: * comments: regular expression interpreter *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
/**
|
||||
* @file regexp.c
|
||||
*
|
||||
* A port of the Unix regular expression compiler.
|
||||
*
|
||||
* @namespace regexp
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#if HAVE_SYS_TYPES_H
|
||||
@@ -22,69 +29,67 @@
|
||||
#include "YapInterface.h"
|
||||
#if HAVE_REGEXEC
|
||||
#include "regex.h"
|
||||
#define yap_regcomp(A,B,C) regcomp(A,B,C)
|
||||
#define yap_regexec(A,B,C,D,E) regexec(A,B,C,D,E)
|
||||
#define yap_regcomp(A, B, C) regcomp(A, B, C)
|
||||
#define yap_regexec(A, B, C, D, E) regexec(A, B, C, D, E)
|
||||
#define yap_regfree(A) regfree(A)
|
||||
#define yap_regerror(A,B,C,D) regfree(A,B,C,D)
|
||||
#define yap_regerror(A, B, C, D) regfree(A, B, C, D)
|
||||
#else
|
||||
#include "yapregex.h"
|
||||
#endif
|
||||
/* for the sake of NULL */
|
||||
#include <stdio.h>
|
||||
|
||||
void init_regexp( void );
|
||||
void init_regexp(void);
|
||||
|
||||
static YAP_Bool check_regexp(void)
|
||||
{
|
||||
unsigned int buflen = (unsigned int)YAP_IntOfTerm(YAP_ARG2)+1;
|
||||
unsigned int sbuflen = (unsigned int)YAP_IntOfTerm(YAP_ARG4)+1;
|
||||
static YAP_Bool check_regexp(void) {
|
||||
unsigned int buflen = (unsigned int)YAP_IntOfTerm(YAP_ARG2) + 1;
|
||||
unsigned int sbuflen = (unsigned int)YAP_IntOfTerm(YAP_ARG4) + 1;
|
||||
char *buf, *sbuf;
|
||||
regex_t reg;
|
||||
int out;
|
||||
int yap_flags = YAP_IntOfTerm(YAP_ARG5);
|
||||
int regcomp_flags = REG_NOSUB|REG_EXTENDED;
|
||||
|
||||
int regcomp_flags = REG_NOSUB | REG_EXTENDED;
|
||||
|
||||
if ((buf = (char *)YAP_AllocSpaceFromYap(buflen)) == NULL) {
|
||||
/* early exit */
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
if (YAP_StringToBuffer(YAP_ARG1,buf,buflen) == FALSE) {
|
||||
if (YAP_StringToBuffer(YAP_ARG1, buf, buflen) == FALSE) {
|
||||
/* something went wrong, possibly a type checking error */
|
||||
YAP_FreeSpaceFromYap(buf);
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
if (yap_flags & 1)
|
||||
regcomp_flags |= REG_ICASE;
|
||||
/* cool, now I have my string in the buffer, let's have some fun */
|
||||
if (yap_regcomp(®,buf, regcomp_flags) != 0)
|
||||
return(FALSE);
|
||||
if (yap_regcomp(®, buf, regcomp_flags) != 0)
|
||||
return (FALSE);
|
||||
if ((sbuf = (char *)YAP_AllocSpaceFromYap(sbuflen)) == NULL) {
|
||||
/* early exit */
|
||||
yap_regfree(®);
|
||||
YAP_FreeSpaceFromYap(buf);
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
if (YAP_StringToBuffer(YAP_ARG3,sbuf,sbuflen) == FALSE) {
|
||||
if (YAP_StringToBuffer(YAP_ARG3, sbuf, sbuflen) == FALSE) {
|
||||
/* something went wrong, possibly a type checking error */
|
||||
yap_regfree(®);
|
||||
YAP_FreeSpaceFromYap(buf);
|
||||
YAP_FreeSpaceFromYap(sbuf);
|
||||
return(FALSE);
|
||||
YAP_FreeSpaceFromYap(sbuf);
|
||||
return (FALSE);
|
||||
}
|
||||
out = yap_regexec(®,sbuf,0,NULL,0);
|
||||
out = yap_regexec(®, sbuf, 0, NULL, 0);
|
||||
yap_regfree(®);
|
||||
YAP_FreeSpaceFromYap(buf);
|
||||
YAP_FreeSpaceFromYap(sbuf);
|
||||
YAP_FreeSpaceFromYap(sbuf);
|
||||
if (out != 0 && out != REG_NOMATCH) {
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
return(out == 0);
|
||||
return (out == 0);
|
||||
}
|
||||
|
||||
static YAP_Bool regexp(void)
|
||||
{
|
||||
unsigned int buflen = (unsigned int)YAP_IntOfTerm(YAP_ARG2)+1;
|
||||
unsigned int sbuflen = (unsigned int)YAP_IntOfTerm(YAP_ARG4)+1;
|
||||
static YAP_Bool regexp(void) {
|
||||
unsigned int buflen = (unsigned int)YAP_IntOfTerm(YAP_ARG2) + 1;
|
||||
unsigned int sbuflen = (unsigned int)YAP_IntOfTerm(YAP_ARG4) + 1;
|
||||
char *buf, *sbuf;
|
||||
regex_t reg;
|
||||
int out;
|
||||
@@ -93,23 +98,22 @@ static YAP_Bool regexp(void)
|
||||
long int tout;
|
||||
int yap_flags = YAP_IntOfTerm(YAP_ARG5);
|
||||
int regcomp_flags = REG_EXTENDED;
|
||||
|
||||
|
||||
|
||||
if ((buf = (char *)YAP_AllocSpaceFromYap(buflen)) == NULL) {
|
||||
/* early exit */
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
if (YAP_StringToBuffer(YAP_ARG1,buf,buflen) == FALSE) {
|
||||
if (YAP_StringToBuffer(YAP_ARG1, buf, buflen) == FALSE) {
|
||||
/* something went wrong, possibly a type checking error */
|
||||
YAP_FreeSpaceFromYap(buf);
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
if (yap_flags & 1)
|
||||
regcomp_flags |= REG_ICASE;
|
||||
/* cool, now I have my string in the buffer, let's have some fun */
|
||||
if (yap_regcomp(®,buf, regcomp_flags) != 0) {
|
||||
if (yap_regcomp(®, buf, regcomp_flags) != 0) {
|
||||
YAP_FreeSpaceFromYap(buf);
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
if (YAP_IsVarTerm(YAP_ARG7)) {
|
||||
nmatch = reg.re_nsub;
|
||||
@@ -120,57 +124,54 @@ static YAP_Bool regexp(void)
|
||||
/* early exit */
|
||||
yap_regfree(®);
|
||||
YAP_FreeSpaceFromYap(buf);
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
if (YAP_StringToBuffer(YAP_ARG3,sbuf,sbuflen) == FALSE) {
|
||||
if (YAP_StringToBuffer(YAP_ARG3, sbuf, sbuflen) == FALSE) {
|
||||
/* something went wrong, possibly a type checking error */
|
||||
yap_regfree(®);
|
||||
YAP_FreeSpaceFromYap(buf);
|
||||
YAP_FreeSpaceFromYap(sbuf);
|
||||
return(FALSE);
|
||||
YAP_FreeSpaceFromYap(sbuf);
|
||||
return (FALSE);
|
||||
}
|
||||
pmatch = YAP_AllocSpaceFromYap(sizeof(regmatch_t)*(nmatch));
|
||||
out = yap_regexec(®,sbuf,nmatch,pmatch,0);
|
||||
pmatch = YAP_AllocSpaceFromYap(sizeof(regmatch_t) * (nmatch));
|
||||
out = yap_regexec(®, sbuf, nmatch, pmatch, 0);
|
||||
if (out == 0) {
|
||||
/* match succeed, let's fill the match in */
|
||||
long int i;
|
||||
YAP_Term TNil = YAP_MkAtomTerm(YAP_LookupAtom("[]"));
|
||||
YAP_Functor FDiff = YAP_MkFunctor(YAP_LookupAtom("-"),2);
|
||||
YAP_Functor FDiff = YAP_MkFunctor(YAP_LookupAtom("-"), 2);
|
||||
|
||||
tout = TNil;
|
||||
for (i = nmatch-1; i >= 0; --i) {
|
||||
for (i = nmatch - 1; i >= 0; --i) {
|
||||
int j;
|
||||
YAP_Term t = TNil;
|
||||
|
||||
if (pmatch[i].rm_so != -1) {
|
||||
if (yap_flags & 2) {
|
||||
YAP_Term to[2];
|
||||
to[0] = YAP_MkIntTerm(pmatch[i].rm_so);
|
||||
to[1] = YAP_MkIntTerm(pmatch[i].rm_eo);
|
||||
t = YAP_MkApplTerm(FDiff,2,to);
|
||||
} else {
|
||||
for (j = pmatch[i].rm_eo-1; j >= pmatch[i].rm_so; j--) {
|
||||
t = YAP_MkPairTerm(YAP_MkIntTerm(sbuf[j]),t);
|
||||
}
|
||||
}
|
||||
tout = YAP_MkPairTerm(t,tout);
|
||||
if (yap_flags & 2) {
|
||||
YAP_Term to[2];
|
||||
to[0] = YAP_MkIntTerm(pmatch[i].rm_so);
|
||||
to[1] = YAP_MkIntTerm(pmatch[i].rm_eo);
|
||||
t = YAP_MkApplTerm(FDiff, 2, to);
|
||||
} else {
|
||||
for (j = pmatch[i].rm_eo - 1; j >= pmatch[i].rm_so; j--) {
|
||||
t = YAP_MkPairTerm(YAP_MkIntTerm(sbuf[j]), t);
|
||||
}
|
||||
}
|
||||
tout = YAP_MkPairTerm(t, tout);
|
||||
}
|
||||
}
|
||||
out = !YAP_Unify(tout, YAP_ARG6);
|
||||
}
|
||||
else if (out != REG_NOMATCH) {
|
||||
} else if (out != REG_NOMATCH) {
|
||||
out = 0;
|
||||
}
|
||||
yap_regfree(®);
|
||||
YAP_FreeSpaceFromYap(buf);
|
||||
YAP_FreeSpaceFromYap(sbuf);
|
||||
YAP_FreeSpaceFromYap(pmatch);
|
||||
return(out == 0);
|
||||
YAP_FreeSpaceFromYap(sbuf);
|
||||
YAP_FreeSpaceFromYap(pmatch);
|
||||
return (out == 0);
|
||||
}
|
||||
|
||||
void
|
||||
init_regexp(void)
|
||||
{
|
||||
void init_regexp(void) {
|
||||
YAP_UserCPredicate("check_regexp", check_regexp, 5);
|
||||
YAP_UserCPredicate("check_regexp", regexp, 7);
|
||||
}
|
||||
@@ -181,19 +182,17 @@ init_regexp(void)
|
||||
|
||||
int WINAPI win_regexp(HANDLE, DWORD, LPVOID);
|
||||
|
||||
int WINAPI win_regexp(HANDLE hinst, DWORD reason, LPVOID reserved)
|
||||
{
|
||||
switch (reason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
case DLL_THREAD_ATTACH:
|
||||
break;
|
||||
case DLL_THREAD_DETACH:
|
||||
break;
|
||||
}
|
||||
int WINAPI win_regexp(HANDLE hinst, DWORD reason, LPVOID reserved) {
|
||||
switch (reason) {
|
||||
case DLL_PROCESS_ATTACH:
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
case DLL_THREAD_ATTACH:
|
||||
break;
|
||||
case DLL_THREAD_DETACH:
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user