2023-07-09 23:12:21 +08:00
|
|
|
#include "re_config.h"
|
2023-07-09 23:35:10 +08:00
|
|
|
#include "pcre_internal.h"
|
2022-08-29 16:29:03 +08:00
|
|
|
|
|
|
|
/*************************************************
|
2023-07-09 23:12:21 +08:00
|
|
|
* Check for newline at given position *
|
|
|
|
*************************************************/
|
2022-08-29 16:29:03 +08:00
|
|
|
|
|
|
|
/* It is guaranteed that the initial value of ptr is less than the end of the
|
|
|
|
string that is being processed.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
ptr pointer to possible newline
|
|
|
|
type the newline type
|
|
|
|
endptr pointer to the end of the string
|
|
|
|
lenptr where to return the length
|
|
|
|
utf8 TRUE if in utf8 mode
|
|
|
|
|
|
|
|
Returns: TRUE or FALSE
|
|
|
|
*/
|
|
|
|
|
2023-07-09 23:12:21 +08:00
|
|
|
BOOL _pcre_is_newline(const uschar* ptr,
|
|
|
|
int type,
|
|
|
|
const uschar* endptr,
|
|
|
|
int* lenptr,
|
|
|
|
BOOL utf8) {
|
|
|
|
int c;
|
|
|
|
if (utf8) {
|
|
|
|
GETCHAR(c, ptr);
|
|
|
|
} else
|
|
|
|
c = *ptr;
|
|
|
|
|
|
|
|
if (type == NLTYPE_ANYCRLF)
|
|
|
|
switch (c) {
|
|
|
|
case 0x000a:
|
|
|
|
*lenptr = 1;
|
|
|
|
return TRUE; /* LF */
|
|
|
|
case 0x000d:
|
|
|
|
*lenptr = (ptr < endptr - 1 && ptr[1] == 0x0a) ? 2 : 1;
|
|
|
|
return TRUE; /* CR */
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* NLTYPE_ANY */
|
|
|
|
|
|
|
|
else
|
|
|
|
switch (c) {
|
|
|
|
case 0x000a: /* LF */
|
|
|
|
case 0x000b: /* VT */
|
|
|
|
case 0x000c:
|
|
|
|
*lenptr = 1;
|
|
|
|
return TRUE; /* FF */
|
|
|
|
case 0x000d:
|
|
|
|
*lenptr = (ptr < endptr - 1 && ptr[1] == 0x0a) ? 2 : 1;
|
|
|
|
return TRUE; /* CR */
|
|
|
|
case 0x0085:
|
|
|
|
*lenptr = utf8 ? 2 : 1;
|
|
|
|
return TRUE; /* NEL */
|
|
|
|
case 0x2028: /* LS */
|
|
|
|
case 0x2029:
|
|
|
|
*lenptr = 3;
|
|
|
|
return TRUE; /* PS */
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
|
|
}
|
2022-08-29 16:29:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************
|
2023-07-09 23:12:21 +08:00
|
|
|
* Check for newline at previous position *
|
|
|
|
*************************************************/
|
2022-08-29 16:29:03 +08:00
|
|
|
|
|
|
|
/* It is guaranteed that the initial value of ptr is greater than the start of
|
|
|
|
the string that is being processed.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
ptr pointer to possible newline
|
|
|
|
type the newline type
|
|
|
|
startptr pointer to the start of the string
|
|
|
|
lenptr where to return the length
|
|
|
|
utf8 TRUE if in utf8 mode
|
|
|
|
|
|
|
|
Returns: TRUE or FALSE
|
|
|
|
*/
|
|
|
|
|
2023-07-09 23:12:21 +08:00
|
|
|
BOOL _pcre_was_newline(const uschar* ptr,
|
|
|
|
int type,
|
|
|
|
const uschar* startptr,
|
|
|
|
int* lenptr,
|
|
|
|
BOOL utf8) {
|
|
|
|
int c;
|
|
|
|
ptr--;
|
2022-08-29 16:29:03 +08:00
|
|
|
#ifdef SUPPORT_UTF8
|
2023-07-09 23:12:21 +08:00
|
|
|
if (utf8) {
|
|
|
|
BACKCHAR(ptr);
|
|
|
|
GETCHAR(c, ptr);
|
|
|
|
} else
|
|
|
|
c = *ptr;
|
|
|
|
#else /* no UTF-8 support */
|
|
|
|
c = *ptr;
|
|
|
|
#endif /* SUPPORT_UTF8 */
|
|
|
|
|
|
|
|
if (type == NLTYPE_ANYCRLF)
|
|
|
|
switch (c) {
|
|
|
|
case 0x000a:
|
|
|
|
*lenptr = (ptr > startptr && ptr[-1] == 0x0d) ? 2 : 1;
|
|
|
|
return TRUE; /* LF */
|
|
|
|
case 0x000d:
|
|
|
|
*lenptr = 1;
|
|
|
|
return TRUE; /* CR */
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
switch (c) {
|
|
|
|
case 0x000a:
|
|
|
|
*lenptr = (ptr > startptr && ptr[-1] == 0x0d) ? 2 : 1;
|
|
|
|
return TRUE; /* LF */
|
|
|
|
case 0x000b: /* VT */
|
|
|
|
case 0x000c: /* FF */
|
|
|
|
case 0x000d:
|
|
|
|
*lenptr = 1;
|
|
|
|
return TRUE; /* CR */
|
|
|
|
case 0x0085:
|
|
|
|
*lenptr = utf8 ? 2 : 1;
|
|
|
|
return TRUE; /* NEL */
|
|
|
|
case 0x2028: /* LS */
|
|
|
|
case 0x2029:
|
|
|
|
*lenptr = 3;
|
|
|
|
return TRUE; /* PS */
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
|
|
}
|
2022-08-29 16:29:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* End of pcre_newline.c */
|