137 lines
3.7 KiB
C
Raw Normal View History

#include "re_config.h"
2023-07-09 23:35:10 +08:00
#include "pcre_internal.h"
/*************************************************
* Check for newline at given position *
*************************************************/
/* 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
*/
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;
}
}
/*************************************************
* Check for newline at previous position *
*************************************************/
/* 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
*/
BOOL _pcre_was_newline(const uschar* ptr,
int type,
const uschar* startptr,
int* lenptr,
BOOL utf8) {
int c;
ptr--;
#ifdef SUPPORT_UTF8
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;
}
}
/* End of pcre_newline.c */