Merge pull request #1613 from RaiKoHoff/DevNewFeatures

New (suppressible) Info-Dialog for "Preserve File Modification Timestamp" feature
This commit is contained in:
Rainer Kottenhoff 2019-09-08 13:30:01 +02:00 committed by GitHub
commit dbb48c5d23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 469 additions and 236 deletions

View File

@ -81,6 +81,7 @@
#define IDS_MUI_EOLMODENAME_CRLF 13017
#define IDS_MUI_EOLMODENAME_CR 13018
#define IDS_MUI_EOLMODENAME_LF 13019
#define IDS_MUI_INF_PRSVFILEMODTM 13020
#define IDS_MUI_SELRECT 14000
#define IDS_MUI_BUFFERTOOSMALL 14001

View File

@ -183,6 +183,8 @@ BEGIN
IDS_MUI_DROP_NO_FILE "Es wurde kein gültiger Dateiname erkannt. Falls aus einer 32-bit Applikation gedropped wurde, dann versuche die Datei auf die Werkzeugleiste zu ziehen."
IDS_MUI_URL_OPEN_FILE "\nAlt + Click um die Datei zu öffnen."
IDS_MUI_URL_OPEN_BROWSER "\nCtrl + Click um die URL im Browser zu öffnen."
IDS_MUI_INF_PRSVFILEMODTM
"Die Speicherung mit originalem Zeitstempel wurde aktiviert.\nDiese Option gilt nun für die gesamte Sitzung (Datei)!"
END
STRINGTABLE

View File

@ -183,6 +183,8 @@ BEGIN
IDS_MUI_DROP_NO_FILE "No valid filename retrieved.\nIf dropping from 32-bit application,\nplease drag and drop to Notepad3's tool bar."
IDS_MUI_URL_OPEN_FILE "\nAlt + Click to open the file."
IDS_MUI_URL_OPEN_BROWSER "\nCtrl + Click to open link in browser."
IDS_MUI_INF_PRSVFILEMODTM
"Preserving original File Modification Timestamp enabled.\nThis option will stay for this session!"
END
STRINGTABLE

View File

@ -183,6 +183,8 @@ BEGIN
IDS_MUI_DROP_NO_FILE "No valid filename retrieved.\nIf dropping from 32-bit application,\nplease drag and drop to Notepad3's tool bar."
IDS_MUI_URL_OPEN_FILE "\nAlt + Click to open the file."
IDS_MUI_URL_OPEN_BROWSER "\nCtrl + Click to open link in browser."
IDS_MUI_INF_PRSVFILEMODTM
"Preserving original File Modification Timestamp enabled.\nThis option will stay for this session!"
END
STRINGTABLE

View File

@ -168,7 +168,7 @@ Oniguruma API Version 6.9.3 2019/07/06
# int onig_new_deluxe(regex_t** reg, const UChar* pattern, const UChar* pattern_end,
OnigCompileInfo* ci, OnigErrorInfo* einfo)
This function is deprecate, and it does not allow the case where
This function is deprecated, and it does not allow the case where
the encoding of pattern and target is different.
Create a regex object.

View File

@ -621,10 +621,16 @@ is_strict_real_node(Node* node)
}
static int
compile_tree_empty_check(Node* node, regex_t* reg, int emptiness, ScanEnv* env)
compile_tree_empty_check(QuantNode* qn, regex_t* reg, ScanEnv* env)
{
int r;
int saved_num_null_check = reg->num_null_check;
int saved_num_null_check;
int emptiness;
Node* body;
body = NODE_BODY((Node* )qn);
emptiness = qn->emptiness;
saved_num_null_check = reg->num_null_check;
if (emptiness != BODY_IS_NOT_EMPTY) {
r = add_op(reg, OP_EMPTY_CHECK_START);
@ -633,14 +639,18 @@ compile_tree_empty_check(Node* node, regex_t* reg, int emptiness, ScanEnv* env)
reg->num_null_check++;
}
r = compile_tree(node, reg, env);
r = compile_tree(body, reg, env);
if (r != 0) return r;
if (emptiness != BODY_IS_NOT_EMPTY) {
if (emptiness == BODY_IS_EMPTY_POSSIBILITY)
r = add_op(reg, OP_EMPTY_CHECK_END);
else if (emptiness == BODY_IS_EMPTY_POSSIBILITY_MEM)
r = add_op(reg, OP_EMPTY_CHECK_END_MEMST);
else if (emptiness == BODY_IS_EMPTY_POSSIBILITY_MEM) {
if (NODE_IS_EMPTY_STATUS_CHECK(qn) != 0)
r = add_op(reg, OP_EMPTY_CHECK_END_MEMST);
else
r = add_op(reg, OP_EMPTY_CHECK_END);
}
else if (emptiness == BODY_IS_EMPTY_POSSIBILITY_REC)
r = add_op(reg, OP_EMPTY_CHECK_END_MEMST_PUSH);
@ -937,7 +947,7 @@ compile_range_repeat_node(QuantNode* qn, int target_len, int emptiness,
r = entry_repeat_range(reg, num_repeat, qn->lower, qn->upper);
if (r != 0) return r;
r = compile_tree_empty_check(NODE_QUANT_BODY(qn), reg, emptiness, env);
r = compile_tree_empty_check(qn, reg, env);
if (r != 0) return r;
if (
@ -1020,7 +1030,7 @@ compile_length_quantifier_node(QuantNode* qn, regex_t* reg)
len += OPSIZE_JUMP + mod_tlen + OPSIZE_PUSH;
}
else if (qn->upper == 0) {
if (qn->is_refered != 0) { /* /(?<n>..){0}/ */
if (qn->include_referred != 0) { /* /(?<n>..){0}/ */
len = OPSIZE_JUMP + tlen;
}
else
@ -1116,7 +1126,7 @@ compile_quantifier_node(QuantNode* qn, regex_t* reg, ScanEnv* env)
COP(reg)->push_or_jump_exact1.addr = SIZE_INC + mod_tlen + OPSIZE_JUMP;
COP(reg)->push_or_jump_exact1.c = STR_(qn->head_exact)->s[0];
r = compile_tree_empty_check(NODE_QUANT_BODY(qn), reg, emptiness, env);
r = compile_tree_empty_check(qn, reg, env);
if (r != 0) return r;
addr = -(mod_tlen + (int )OPSIZE_PUSH_OR_JUMP_EXACT1);
@ -1129,7 +1139,7 @@ compile_quantifier_node(QuantNode* qn, regex_t* reg, ScanEnv* env)
COP(reg)->push_if_peek_next.addr = SIZE_INC + mod_tlen + OPSIZE_JUMP;
COP(reg)->push_if_peek_next.c = STR_(qn->next_head_exact)->s[0];
r = compile_tree_empty_check(NODE_QUANT_BODY(qn), reg, emptiness, env);
r = compile_tree_empty_check(qn, reg, env);
if (r != 0) return r;
addr = -(mod_tlen + (int )OPSIZE_PUSH_IF_PEEK_NEXT);
@ -1139,7 +1149,7 @@ compile_quantifier_node(QuantNode* qn, regex_t* reg, ScanEnv* env)
if (r != 0) return r;
COP(reg)->push.addr = SIZE_INC + mod_tlen + OPSIZE_JUMP;
r = compile_tree_empty_check(NODE_QUANT_BODY(qn), reg, emptiness, env);
r = compile_tree_empty_check(qn, reg, env);
if (r != 0) return r;
addr = -(mod_tlen + (int )OPSIZE_PUSH);
@ -1154,7 +1164,7 @@ compile_quantifier_node(QuantNode* qn, regex_t* reg, ScanEnv* env)
if (r != 0) return r;
COP(reg)->jump.addr = mod_tlen + SIZE_INC;
r = compile_tree_empty_check(NODE_QUANT_BODY(qn), reg, emptiness, env);
r = compile_tree_empty_check(qn, reg, env);
if (r != 0) return r;
r = add_op(reg, OP_PUSH);
@ -1163,7 +1173,7 @@ compile_quantifier_node(QuantNode* qn, regex_t* reg, ScanEnv* env)
}
}
else if (qn->upper == 0) {
if (qn->is_refered != 0) { /* /(?<n>..){0}/ */
if (qn->include_referred != 0) { /* /(?<n>..){0}/ */
r = add_op(reg, OP_JUMP);
if (r != 0) return r;
COP(reg)->jump.addr = tlen + SIZE_INC;
@ -1267,7 +1277,7 @@ compile_length_bag_node(BagNode* node, regex_t* reg)
if (NODE_IS_CALLED(node)) {
len = OPSIZE_MEMORY_START_PUSH + tlen
+ OPSIZE_CALL + OPSIZE_JUMP + OPSIZE_RETURN;
if (MEM_STATUS_AT0(reg->bt_mem_end, node->m.regnum))
if (MEM_STATUS_AT0(reg->push_mem_end, node->m.regnum))
len += (NODE_IS_RECURSION(node)
? OPSIZE_MEMORY_END_PUSH_REC : OPSIZE_MEMORY_END_PUSH);
else
@ -1276,18 +1286,18 @@ compile_length_bag_node(BagNode* node, regex_t* reg)
}
else if (NODE_IS_RECURSION(node)) {
len = OPSIZE_MEMORY_START_PUSH;
len += tlen + (MEM_STATUS_AT0(reg->bt_mem_end, node->m.regnum)
len += tlen + (MEM_STATUS_AT0(reg->push_mem_end, node->m.regnum)
? OPSIZE_MEMORY_END_PUSH_REC : OPSIZE_MEMORY_END_REC);
}
else
#endif
{
if (MEM_STATUS_AT0(reg->bt_mem_start, node->m.regnum))
if (MEM_STATUS_AT0(reg->push_mem_start, node->m.regnum))
len = OPSIZE_MEMORY_START_PUSH;
else
len = OPSIZE_MEMORY_START;
len += tlen + (MEM_STATUS_AT0(reg->bt_mem_end, node->m.regnum)
len += tlen + (MEM_STATUS_AT0(reg->push_mem_end, node->m.regnum)
? OPSIZE_MEMORY_END_PUSH : OPSIZE_MEMORY_END);
}
break;
@ -1380,7 +1390,7 @@ compile_bag_memory_node(BagNode* node, regex_t* reg, ScanEnv* env)
else {
len = compile_length_tree(NODE_BAG_BODY(node), reg);
len += (OPSIZE_MEMORY_START_PUSH + OPSIZE_RETURN);
if (MEM_STATUS_AT0(reg->bt_mem_end, node->m.regnum))
if (MEM_STATUS_AT0(reg->push_mem_end, node->m.regnum))
len += (NODE_IS_RECURSION(node)
? OPSIZE_MEMORY_END_PUSH_REC : OPSIZE_MEMORY_END_PUSH);
else
@ -1394,7 +1404,7 @@ compile_bag_memory_node(BagNode* node, regex_t* reg, ScanEnv* env)
}
#endif
if (MEM_STATUS_AT0(reg->bt_mem_start, node->m.regnum))
if (MEM_STATUS_AT0(reg->push_mem_start, node->m.regnum))
r = add_op(reg, OP_MEMORY_START_PUSH);
else
r = add_op(reg, OP_MEMORY_START);
@ -1405,7 +1415,7 @@ compile_bag_memory_node(BagNode* node, regex_t* reg, ScanEnv* env)
if (r != 0) return r;
#ifdef USE_CALL
if (MEM_STATUS_AT0(reg->bt_mem_end, node->m.regnum))
if (MEM_STATUS_AT0(reg->push_mem_end, node->m.regnum))
r = add_op(reg, (NODE_IS_RECURSION(node)
? OP_MEMORY_END_PUSH_REC : OP_MEMORY_END_PUSH));
else
@ -1418,7 +1428,7 @@ compile_bag_memory_node(BagNode* node, regex_t* reg, ScanEnv* env)
r = add_op(reg, OP_RETURN);
}
#else
if (MEM_STATUS_AT0(reg->bt_mem_end, node->m.regnum))
if (MEM_STATUS_AT0(reg->push_mem_end, node->m.regnum))
r = add_op(reg, OP_MEMORY_END_PUSH);
else
r = add_op(reg, OP_MEMORY_END);
@ -2303,11 +2313,11 @@ disable_noname_group_capture(Node** root, regex_t* reg, ScanEnv* env)
}
}
loc = env->capture_history;
MEM_STATUS_CLEAR(env->capture_history);
loc = env->cap_history;
MEM_STATUS_CLEAR(env->cap_history);
for (i = 1; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {
if (MEM_STATUS_AT(loc, i)) {
MEM_STATUS_ON_SIMPLE(env->capture_history, map[i].new_val);
MEM_STATUS_ON_SIMPLE(env->cap_history, map[i].new_val);
}
}
@ -2871,9 +2881,9 @@ tree_min_len(Node* node, ScanEnv* env)
if (NODE_IS_RECURSION(node)) break;
backs = BACKREFS_P(br);
len = tree_min_len(mem_env[backs[0]].node, env);
len = tree_min_len(mem_env[backs[0]].mem_node, env);
for (i = 1; i < br->back_num; i++) {
tmin = tree_min_len(mem_env[backs[i]].node, env);
tmin = tree_min_len(mem_env[backs[i]].mem_node, env);
if (len > tmin) len = tmin;
}
}
@ -3042,7 +3052,7 @@ tree_max_len(Node* node, ScanEnv* env)
}
backs = BACKREFS_P(br);
for (i = 0; i < br->back_num; i++) {
tmax = tree_max_len(mem_env[backs[i]].node, env);
tmax = tree_max_len(mem_env[backs[i]].mem_node, env);
if (len < tmax) len = tmax;
}
}
@ -3179,7 +3189,7 @@ check_backrefs(Node* node, ScanEnv* env)
if (backs[i] > env->num_mem)
return ONIGERR_INVALID_BACKREF;
NODE_STATUS_ADD(mem_env[backs[i]].node, BACKREF);
NODE_STATUS_ADD(mem_env[backs[i]].mem_node, BACKREF);
}
r = 0;
}
@ -3193,6 +3203,204 @@ check_backrefs(Node* node, ScanEnv* env)
return r;
}
static int
set_empty_repeat_node_trav(Node* node, Node* empty, ScanEnv* env)
{
int r;
switch (NODE_TYPE(node)) {
case NODE_LIST:
case NODE_ALT:
do {
r = set_empty_repeat_node_trav(NODE_CAR(node), empty, env);
} while (r == 0 && IS_NOT_NULL(node = NODE_CDR(node)));
break;
case NODE_ANCHOR:
{
AnchorNode* an = ANCHOR_(node);
if (! ANCHOR_HAS_BODY(an)) {
r = 0;
break;
}
switch (an->type) {
case ANCR_PREC_READ:
case ANCR_LOOK_BEHIND:
empty = NULL_NODE;
break;
default:
break;
}
r = set_empty_repeat_node_trav(NODE_BODY(node), empty, env);
}
break;
case NODE_QUANT:
{
QuantNode* qn = QUANT_(node);
if (qn->emptiness != BODY_IS_NOT_EMPTY) empty = node;
r = set_empty_repeat_node_trav(NODE_BODY(node), empty, env);
}
break;
case NODE_BAG:
if (IS_NOT_NULL(NODE_BODY(node))) {
r = set_empty_repeat_node_trav(NODE_BODY(node), empty, env);
if (r != 0) return r;
}
{
BagNode* en = BAG_(node);
if (en->type == BAG_MEMORY) {
if (NODE_IS_BACKREF(node)) {
if (IS_NOT_NULL(empty))
SCANENV_MEMENV(env)[en->m.regnum].empty_repeat_node = empty;
}
}
else if (en->type == BAG_IF_ELSE) {
if (IS_NOT_NULL(en->te.Then)) {
r = set_empty_repeat_node_trav(en->te.Then, empty, env);
if (r != 0) return r;
}
if (IS_NOT_NULL(en->te.Else)) {
r = set_empty_repeat_node_trav(en->te.Else, empty, env);
}
}
}
break;
default:
r = 0;
break;
}
return r;
}
static int
is_ancestor_node(Node* node, Node* me)
{
Node* parent;
while ((parent = NODE_PARENT(me)) != NULL_NODE) {
if (parent == node) return 1;
me = parent;
}
return 0;
}
static void
set_empty_status_check_trav(Node* node, ScanEnv* env)
{
switch (NODE_TYPE(node)) {
case NODE_LIST:
case NODE_ALT:
do {
set_empty_status_check_trav(NODE_CAR(node), env);
} while (IS_NOT_NULL(node = NODE_CDR(node)));
break;
case NODE_ANCHOR:
{
AnchorNode* an = ANCHOR_(node);
if (! ANCHOR_HAS_BODY(an)) break;
set_empty_status_check_trav(NODE_BODY(node), env);
}
break;
case NODE_QUANT:
set_empty_status_check_trav(NODE_BODY(node), env);
break;
case NODE_BAG:
if (IS_NOT_NULL(NODE_BODY(node)))
set_empty_status_check_trav(NODE_BODY(node), env);
{
BagNode* en = BAG_(node);
if (en->type == BAG_IF_ELSE) {
if (IS_NOT_NULL(en->te.Then)) {
set_empty_status_check_trav(en->te.Then, env);
}
if (IS_NOT_NULL(en->te.Else)) {
set_empty_status_check_trav(en->te.Else, env);
}
}
}
break;
case NODE_BACKREF:
{
int i;
int* backs;
MemEnv* mem_env = SCANENV_MEMENV(env);
BackRefNode* br = BACKREF_(node);
backs = BACKREFS_P(br);
for (i = 0; i < br->back_num; i++) {
Node* ernode = mem_env[backs[i]].empty_repeat_node;
if (IS_NOT_NULL(ernode)) {
if (! is_ancestor_node(ernode, node)) {
MEM_STATUS_LIMIT_ON(env->reg->empty_status_mem, backs[i]);
NODE_STATUS_ADD(ernode, EMPTY_STATUS_CHECK);
NODE_STATUS_ADD(mem_env[backs[i]].mem_node, EMPTY_STATUS_CHECK);
}
}
}
}
break;
default:
break;
}
}
static void
set_parent_node_trav(Node* node, Node* parent)
{
NODE_PARENT(node) = parent;
switch (NODE_TYPE(node)) {
case NODE_LIST:
case NODE_ALT:
do {
set_parent_node_trav(NODE_CAR(node), node);
} while (IS_NOT_NULL(node = NODE_CDR(node)));
break;
case NODE_ANCHOR:
if (! ANCHOR_HAS_BODY(ANCHOR_(node))) break;
set_parent_node_trav(NODE_BODY(node), node);
break;
case NODE_QUANT:
set_parent_node_trav(NODE_BODY(node), node);
break;
case NODE_BAG:
if (IS_NOT_NULL(NODE_BODY(node)))
set_parent_node_trav(NODE_BODY(node), node);
{
BagNode* en = BAG_(node);
if (en->type == BAG_IF_ELSE) {
if (IS_NOT_NULL(en->te.Then))
set_parent_node_trav(en->te.Then, node);
if (IS_NOT_NULL(en->te.Else)) {
set_parent_node_trav(en->te.Else, node);
}
}
}
break;
default:
break;
}
}
#ifdef USE_CALL
@ -3298,6 +3506,9 @@ infinite_recursive_call_check(Node* node, ScanEnv* env, int head)
if ((eret & RECURSION_MUST) == 0)
r &= ~RECURSION_MUST;
}
else {
r &= ~RECURSION_MUST;
}
}
else {
r = infinite_recursive_call_check(NODE_BODY(node), env, head);
@ -3472,7 +3683,7 @@ recursive_call_check_trav(Node* node, ScanEnv* env, int state)
r = recursive_call_check_trav(NODE_BODY(node), env, state);
if (QUANT_(node)->upper == 0) {
if (r == FOUND_CALLED_NODE)
QUANT_(node)->is_refered = 1;
QUANT_(node)->include_referred = 1;
}
break;
@ -3495,8 +3706,10 @@ recursive_call_check_trav(Node* node, ScanEnv* env, int state)
if (! NODE_IS_RECURSION(node)) {
NODE_STATUS_ADD(node, MARK1);
r = recursive_call_check(NODE_BODY(node));
if (r != 0)
if (r != 0) {
NODE_STATUS_ADD(node, RECURSION);
MEM_STATUS_ON(env->backtrack_mem, en->m.regnum);
}
NODE_STATUS_REMOVE(node, MARK1);
}
@ -4141,7 +4354,7 @@ setup_call_node_call(CallNode* cn, ScanEnv* env, int state)
}
set_call_attr:
NODE_CALL_BODY(cn) = mem_env[cn->group_num].node;
NODE_CALL_BODY(cn) = mem_env[cn->group_num].mem_node;
if (IS_NULL(NODE_CALL_BODY(cn))) {
onig_scan_env_set_error_string(env, ONIGERR_UNDEFINED_NAME_REFERENCE,
cn->name, cn->name_end);
@ -4427,6 +4640,8 @@ setup_called_state_call(Node* node, int state)
}
}
else if (en->type == BAG_IF_ELSE) {
state |= IN_ALT;
setup_called_state_call(NODE_BODY(node), state);
if (IS_NOT_NULL(en->te.Then)) {
setup_called_state_call(en->te.Then, state);
}
@ -4483,6 +4698,7 @@ setup_called_state(Node* node, int state)
setup_called_state(NODE_BODY(node), state);
break;
case BAG_IF_ELSE:
state |= IN_ALT;
setup_called_state(NODE_BODY(node), state);
if (IS_NOT_NULL(en->te.Then))
setup_called_state(en->te.Then, state);
@ -4634,12 +4850,6 @@ setup_quant(Node* node, regex_t* reg, int state, ScanEnv* env)
if (d == 0) {
#ifdef USE_STUBBORN_CHECK_CAPTURES_IN_EMPTY_REPEAT
qn->emptiness = quantifiers_memory_node_info(body);
if (qn->emptiness == BODY_IS_EMPTY_POSSIBILITY_REC) {
if (NODE_TYPE(body) == NODE_BAG &&
BAG_(body)->type == BAG_MEMORY) {
MEM_STATUS_ON(env->bt_mem_end, BAG_(body)->m.regnum);
}
}
#else
qn->emptiness = BODY_IS_EMPTY_POSSIBILITY;
#endif
@ -4739,10 +4949,9 @@ setup_tree(Node* node, regex_t* reg, int state, ScanEnv* env)
for (i = 0; i < br->back_num; i++) {
if (p[i] > env->num_mem) return ONIGERR_INVALID_BACKREF;
MEM_STATUS_ON(env->backrefed_mem, p[i]);
MEM_STATUS_ON(env->bt_mem_start, p[i]);
#ifdef USE_BACKREF_WITH_LEVEL
if (NODE_IS_NEST_LEVEL(node)) {
MEM_STATUS_ON(env->bt_mem_end, p[i]);
MEM_STATUS_ON(env->backtrack_mem, p[i]);
}
#endif
}
@ -4770,7 +4979,7 @@ setup_tree(Node* node, regex_t* reg, int state, ScanEnv* env)
if ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT | IN_MULTI_ENTRY)) != 0
|| NODE_IS_RECURSION(node)) {
MEM_STATUS_ON(env->bt_mem_start, en->m.regnum);
MEM_STATUS_ON(env->backtrack_mem, en->m.regnum);
}
r = setup_tree(NODE_BODY(node), reg, state, env);
break;
@ -5725,11 +5934,11 @@ optimize_nodes(Node* node, OptNode* opt, OptEnv* env)
break;
}
backs = BACKREFS_P(br);
min = tree_min_len(mem_env[backs[0]].node, env->scan_env);
max = tree_max_len(mem_env[backs[0]].node, env->scan_env);
min = tree_min_len(mem_env[backs[0]].mem_node, env->scan_env);
max = tree_max_len(mem_env[backs[0]].mem_node, env->scan_env);
for (i = 1; i < br->back_num; i++) {
tmin = tree_min_len(mem_env[backs[i]].node, env->scan_env);
tmax = tree_max_len(mem_env[backs[i]].node, env->scan_env);
tmin = tree_min_len(mem_env[backs[i]].mem_node, env->scan_env);
tmax = tree_max_len(mem_env[backs[i]].mem_node, env->scan_env);
if (min > tmin) min = tmin;
if (max < tmax) max = tmax;
}
@ -6301,7 +6510,7 @@ onig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,
Node* root;
ScanEnv scan_env;
#ifdef USE_CALL
UnsetAddrList uslist;
UnsetAddrList uslist = {0};
#endif
root = 0;
@ -6328,6 +6537,7 @@ onig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,
reg->num_null_check = 0;
reg->repeat_range_alloc = 0;
reg->repeat_range = (OnigRepeatRange* )NULL;
reg->empty_status_mem = 0;
r = onig_parse_tree(&root, pattern, pattern_end, reg, &scan_env);
if (r != 0) goto err;
@ -6370,20 +6580,38 @@ onig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,
r = setup_tree(root, reg, 0, &scan_env);
if (r != 0) goto err_unset;
if (scan_env.backref_num != 0) {
set_parent_node_trav(root, NULL_NODE);
r = set_empty_repeat_node_trav(root, NULL_NODE, &scan_env);
if (r != 0) goto err_unset;
set_empty_status_check_trav(root, &scan_env);
}
#ifdef ONIG_DEBUG_PARSE
print_tree(stderr, root);
#endif
reg->capture_history = scan_env.capture_history;
reg->bt_mem_start = scan_env.bt_mem_start;
reg->bt_mem_start |= reg->capture_history;
if (IS_FIND_CONDITION(reg->options))
MEM_STATUS_ON_ALL(reg->bt_mem_end);
else {
reg->bt_mem_end = scan_env.bt_mem_end;
reg->bt_mem_end |= reg->capture_history;
reg->capture_history = scan_env.cap_history;
reg->push_mem_start = scan_env.backtrack_mem | scan_env.cap_history;
#ifdef USE_CALLOUT
if (IS_NOT_NULL(reg->extp) && reg->extp->callout_num != 0) {
reg->push_mem_end = reg->push_mem_start;
}
reg->bt_mem_start |= reg->bt_mem_end;
else {
if (MEM_STATUS_IS_ALL_ON(reg->push_mem_start))
reg->push_mem_end = scan_env.backrefed_mem | scan_env.cap_history;
else
reg->push_mem_end = reg->push_mem_start &
(scan_env.backrefed_mem | scan_env.cap_history);
}
#else
if (MEM_STATUS_IS_ALL_ON(reg->push_mem_start))
reg->push_mem_end = scan_env.backrefed_mem | scan_env.cap_history;
else
reg->push_mem_end = reg->push_mem_start &
(scan_env.backrefed_mem | scan_env.cap_history);
#endif
clear_optimize_info(reg);
#ifndef ONIG_DONT_OPTIMIZE
@ -6417,14 +6645,14 @@ onig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,
}
#endif
if ((reg->num_repeat != 0) || (reg->bt_mem_end != 0)
if ((reg->num_repeat != 0) || (reg->push_mem_end != 0)
#ifdef USE_CALLOUT
|| (IS_NOT_NULL(reg->extp) && reg->extp->callout_num != 0)
#endif
)
reg->stack_pop_level = STACK_POP_LEVEL_ALL;
else {
if (reg->bt_mem_start != 0)
if (reg->push_mem_start != 0)
reg->stack_pop_level = STACK_POP_LEVEL_MEM_START;
else
reg->stack_pop_level = STACK_POP_LEVEL_FREE;

View File

@ -182,7 +182,8 @@ onigenc_get_right_adjust_char_head_with_prev(OnigEncoding enc,
p += enclen(enc, p);
}
else {
if (prev) *prev = (const UChar* )NULL; /* Sorry */
if (prev)
*prev = onigenc_get_prev_char_head(enc, start, p);
}
return p;
}

View File

@ -39,6 +39,15 @@
#define CHECK_INTERRUPT_IN_MATCH
#define STACK_MEM_START(reg, i) \
(MEM_STATUS_AT((reg)->push_mem_start, (i)) != 0 ? \
STACK_AT(mem_start_stk[i])->u.mem.pstr : (UChar* )((void* )(mem_start_stk[i])))
#define STACK_MEM_END(reg, i) \
(MEM_STATUS_AT((reg)->push_mem_end, (i)) != 0 ? \
STACK_AT(mem_end_stk[i])->u.mem.pstr : (UChar* )((void* )(mem_end_stk[i])))
#ifdef USE_CALLOUT
typedef struct {
int last_match_at_call_counter;
@ -625,8 +634,8 @@ onig_print_compiled_byte_code_list(FILE* f, regex_t* reg)
Operation* start = reg->ops;
Operation* end = reg->ops + reg->ops_used;
fprintf(f, "bt_mem_start: 0x%x, bt_mem_end: 0x%x\n",
reg->bt_mem_start, reg->bt_mem_end);
fprintf(f, "push_mem_start: 0x%x, push_mem_end: 0x%x\n",
reg->push_mem_start, reg->push_mem_end);
fprintf(f, "code-length: %d\n", reg->ops_used);
bp = start;
@ -1929,7 +1938,7 @@ stack_double(int is_alloca, char** arg_alloc_base,
(addr) = 0;\
}\
else {\
if (MEM_STATUS_AT((reg)->bt_mem_end, k->zid))\
if (MEM_STATUS_AT((reg)->push_mem_end, k->zid))\
(addr) = STACK_AT(k->u.mem.prev_end)->u.mem.pstr;\
else\
(addr) = (UChar* )k->u.mem.prev_end;\
@ -1950,10 +1959,10 @@ stack_double(int is_alloca, char** arg_alloc_base,
}\
else {\
UChar* endp;\
int level = 0;\
(isnull) = 1;\
while (k < stk) {\
if (k->type == STK_MEM_START && level == 0) {\
if (k->type == STK_MEM_START &&\
MEM_STATUS_LIMIT_AT((reg)->empty_status_mem, k->zid)) {\
STACK_MEM_START_GET_PREV_END_ADDR(k, reg, endp);\
if (endp == 0) {\
(isnull) = 0; break;\
@ -1965,12 +1974,6 @@ stack_double(int is_alloca, char** arg_alloc_base,
(isnull) = -1; /* empty, but position changed */ \
}\
}\
else if (k->type == STK_PREC_READ_START) {\
level++;\
}\
else if (k->type == STK_PREC_READ_END) {\
level--;\
}\
k++;\
}\
break;\
@ -1995,11 +1998,11 @@ stack_double(int is_alloca, char** arg_alloc_base,
}\
else {\
UChar* endp;\
int prec_level = 0;\
(isnull) = 1;\
while (k < stk) {\
if (k->type == STK_MEM_START) {\
if (level == 0 && prec_level == 0) {\
if (level == 0 && \
MEM_STATUS_LIMIT_AT((reg)->empty_status_mem, k->zid) !=0) {\
STACK_MEM_START_GET_PREV_END_ADDR(k, reg, endp);\
if (endp == 0) {\
(isnull) = 0; break;\
@ -2018,12 +2021,6 @@ stack_double(int is_alloca, char** arg_alloc_base,
else if (k->type == STK_EMPTY_CHECK_END) {\
if (k->zid == (sid)) level--;\
}\
else if (k->type == STK_PREC_READ_START) {\
prec_level++;\
}\
else if (k->type == STK_PREC_READ_END) {\
prec_level--;\
}\
k++;\
}\
break;\
@ -2700,15 +2697,8 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
rmt[0].rm_eo = (regoff_t )(s - str);
for (i = 1; i <= num_mem; i++) {
if (mem_end_stk[i] != INVALID_STACK_INDEX) {
if (MEM_STATUS_AT(reg->bt_mem_start, i))
rmt[i].rm_so = (regoff_t )(STACK_AT(mem_start_stk[i])->u.mem.pstr - str);
else
rmt[i].rm_so = (regoff_t )((UChar* )((void* )(mem_start_stk[i])) - str);
rmt[i].rm_eo = (regoff_t )((MEM_STATUS_AT(reg->bt_mem_end, i)
? STACK_AT(mem_end_stk[i])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[i]))
- str);
rmt[i].rm_so = (regoff_t )(STACK_MEM_START(reg, i) - str);
rmt[i].rm_eo = (regoff_t )(STACK_MEM_END(reg, i) - str);
}
else {
rmt[i].rm_so = rmt[i].rm_eo = ONIG_REGION_NOTPOS;
@ -2721,14 +2711,8 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
region->end[0] = (int )(s - str);
for (i = 1; i <= num_mem; i++) {
if (mem_end_stk[i] != INVALID_STACK_INDEX) {
if (MEM_STATUS_AT(reg->bt_mem_start, i))
region->beg[i] = (int )(STACK_AT(mem_start_stk[i])->u.mem.pstr - str);
else
region->beg[i] = (int )((UChar* )((void* )mem_start_stk[i]) - str);
region->end[i] = (int )((MEM_STATUS_AT(reg->bt_mem_end, i)
? STACK_AT(mem_end_stk[i])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[i])) - str);
region->beg[i] = (int )(STACK_MEM_START(reg, i) - str);
region->end[i] = (int )(STACK_MEM_END(reg, i) - str);
}
else {
region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;
@ -3442,7 +3426,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
mem_end_stk[mem] = (StackIndex )((void* )s);
STACK_GET_MEM_START(mem, stkp);
if (MEM_STATUS_AT(reg->bt_mem_start, mem))
if (MEM_STATUS_AT(reg->push_mem_start, mem))
mem_start_stk[mem] = GET_STACK_INDEX(stkp);
else
mem_start_stk[mem] = (StackIndex )((void* )stkp->u.mem.pstr);
@ -3470,14 +3454,8 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
if (mem_end_stk[mem] == INVALID_STACK_INDEX) goto fail;
if (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;
if (MEM_STATUS_AT(reg->bt_mem_start, mem))
pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
else
pstart = (UChar* )((void* )mem_start_stk[mem]);
pend = (MEM_STATUS_AT(reg->bt_mem_end, mem)
? STACK_AT(mem_end_stk[mem])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[mem]));
pstart = STACK_MEM_START(reg, mem);
pend = STACK_MEM_END(reg, mem);
n = (int )(pend - pstart);
if (n != 0) {
DATA_ENSURE(n);
@ -3499,14 +3477,8 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
if (mem_end_stk[mem] == INVALID_STACK_INDEX) goto fail;
if (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;
if (MEM_STATUS_AT(reg->bt_mem_start, mem))
pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
else
pstart = (UChar* )((void* )mem_start_stk[mem]);
pend = (MEM_STATUS_AT(reg->bt_mem_end, mem)
? STACK_AT(mem_end_stk[mem])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[mem]));
pstart = STACK_MEM_START(reg, mem);
pend = STACK_MEM_END(reg, mem);
n = (int )(pend - pstart);
if (n != 0) {
DATA_ENSURE(n);
@ -3531,14 +3503,8 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
if (mem_end_stk[mem] == INVALID_STACK_INDEX) continue;
if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;
if (MEM_STATUS_AT(reg->bt_mem_start, mem))
pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
else
pstart = (UChar* )((void* )mem_start_stk[mem]);
pend = (MEM_STATUS_AT(reg->bt_mem_end, mem)
? STACK_AT(mem_end_stk[mem])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[mem]));
pstart = STACK_MEM_START(reg, mem);
pend = STACK_MEM_END(reg, mem);
n = (int )(pend - pstart);
if (n != 0) {
DATA_ENSURE(n);
@ -3569,14 +3535,8 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
if (mem_end_stk[mem] == INVALID_STACK_INDEX) continue;
if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;
if (MEM_STATUS_AT(reg->bt_mem_start, mem))
pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
else
pstart = (UChar* )((void* )mem_start_stk[mem]);
pend = (MEM_STATUS_AT(reg->bt_mem_end, mem)
? STACK_AT(mem_end_stk[mem])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[mem]));
pstart = STACK_MEM_START(reg, mem);
pend = STACK_MEM_END(reg, mem);
n = (int )(pend - pstart);
if (n != 0) {
DATA_ENSURE(n);
@ -4044,14 +4004,14 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
OnigCalloutFunc func;
OnigCalloutArgs args;
of = ONIG_CALLOUT_OF_NAME;
name_id = p->callout_name.id;
mem = p->callout_name.num;
of = ONIG_CALLOUT_OF_NAME;
mem = p->callout_name.num;
callout_common_entry:
e = onig_reg_callout_list_at(reg, mem);
in = e->in;
if (of == ONIG_CALLOUT_OF_NAME) {
name_id = p->callout_name.id;
func = onig_get_callout_start_func(reg, mem);
}
else {
@ -4506,17 +4466,17 @@ onig_match_with_param(regex_t* reg, const UChar* str, const UChar* end,
}
static int
forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
UChar* range, UChar** low, UChar** high, UChar** low_prev)
forward_search(regex_t* reg, const UChar* str, const UChar* end, UChar* start,
UChar* range, UChar** low, UChar** high, UChar** low_prev)
{
UChar *p, *pprev = (UChar* )NULL;
#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr, "forward_search_range: str: %p, end: %p, s: %p, range: %p\n",
str, end, s, range);
fprintf(stderr, "forward_search: str: %p, end: %p, start: %p, range: %p\n",
str, end, start, range);
#endif
p = s;
p = start;
if (reg->dmin > 0) {
if (ONIGENC_IS_SINGLEBYTE(reg->enc)) {
p += reg->dmin;
@ -4559,7 +4519,7 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
}
if (p && p < range) {
if (p - reg->dmin < s) {
if (p - reg->dmin < start) {
retry_gate:
pprev = p;
p += enclen(reg->enc, p);
@ -4572,8 +4532,7 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
switch (reg->sub_anchor) {
case ANCR_BEGIN_LINE:
if (!ON_STR_BEGIN(p)) {
prev = onigenc_get_prev_char_head(reg->enc,
(pprev ? pprev : str), p);
prev = onigenc_get_prev_char_head(reg->enc, (pprev ? pprev : str), p);
if (!ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end))
goto retry_gate;
}
@ -4594,6 +4553,7 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
#endif
)
goto retry_gate;
break;
}
}
@ -4601,8 +4561,8 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
if (reg->dmax == 0) {
*low = p;
if (low_prev) {
if (*low > s)
*low_prev = onigenc_get_prev_char_head(reg->enc, s, p);
if (*low > start)
*low_prev = onigenc_get_prev_char_head(reg->enc, start, p);
else
*low_prev = onigenc_get_prev_char_head(reg->enc,
(pprev ? pprev : str), p);
@ -4617,12 +4577,9 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
}
else {
*low = p - reg->dmax;
if (*low > s) {
*low = onigenc_get_right_adjust_char_head_with_prev(reg->enc, s,
if (*low > start) {
*low = onigenc_get_right_adjust_char_head_with_prev(reg->enc, start,
*low, (const UChar** )low_prev);
if (low_prev && IS_NULL(*low_prev))
*low_prev = onigenc_get_prev_char_head(reg->enc,
(pprev ? pprev : s), *low);
}
else {
if (low_prev)
@ -4637,7 +4594,7 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr,
"forward_search_range success: low: %d, high: %d, dmin: %d, dmax: %d\n",
"forward_search success: low: %d, high: %d, dmin: %d, dmax: %d\n",
(int )(*low - str), (int )(*high - str), reg->dmin, reg->dmax);
#endif
return 1; /* success */
@ -4648,9 +4605,8 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
static int
backward_search_range(regex_t* reg, const UChar* str, const UChar* end,
UChar* s, const UChar* range, UChar* adjrange,
UChar** low, UChar** high)
backward_search(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
const UChar* range, UChar* adjrange, UChar** low, UChar** high)
{
UChar *p;
@ -4731,7 +4687,7 @@ backward_search_range(regex_t* reg, const UChar* str, const UChar* end,
}
#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr, "backward_search_range: low: %d, high: %d\n",
fprintf(stderr, "backward_search: low: %d, high: %d\n",
(int )(*low - str), (int )(*high - str));
#endif
return 1; /* success */
@ -4739,7 +4695,7 @@ backward_search_range(regex_t* reg, const UChar* str, const UChar* end,
fail:
#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr, "backward_search_range: fail.\n");
fprintf(stderr, "backward_search: fail.\n");
#endif
return 0; /* fail */
}
@ -4958,8 +4914,8 @@ onig_search_with_param(regex_t* reg, const UChar* str, const UChar* end,
if (reg->dmax != INFINITE_LEN) {
do {
if (! forward_search_range(reg, str, end, s, sch_range,
&low, &high, &low_prev)) goto mismatch;
if (! forward_search(reg, str, end, s, sch_range, &low, &high,
&low_prev)) goto mismatch;
if (s < low) {
s = low;
prev = low_prev;
@ -4973,8 +4929,8 @@ onig_search_with_param(regex_t* reg, const UChar* str, const UChar* end,
goto mismatch;
}
else { /* check only. */
if (! forward_search_range(reg, str, end, s, sch_range,
&low, &high, (UChar** )NULL)) goto mismatch;
if (! forward_search(reg, str, end, s, sch_range, &low, &high,
(UChar** )NULL)) goto mismatch;
if ((reg->anchor & ANCR_ANYCHAR_INF) != 0) {
do {
@ -5023,8 +4979,8 @@ onig_search_with_param(regex_t* reg, const UChar* str, const UChar* end,
do {
sch_start = s + reg->dmax;
if (sch_start > end) sch_start = (UChar* )end;
if (backward_search_range(reg, str, end, sch_start, range, adjrange,
&low, &high) <= 0)
if (backward_search(reg, str, end, sch_start, range, adjrange,
&low, &high) <= 0)
goto mismatch;
if (s > high)
@ -5053,8 +5009,8 @@ onig_search_with_param(regex_t* reg, const UChar* str, const UChar* end,
start, sch_start);
}
}
if (backward_search_range(reg, str, end, sch_start, range, adjrange,
&low, &high) <= 0) goto mismatch;
if (backward_search(reg, str, end, sch_start, range, adjrange,
&low, &high) <= 0) goto mismatch;
}
}
@ -5403,22 +5359,20 @@ onig_get_capture_range_in_callout(OnigCalloutArgs* a, int mem_num, int* begin, i
const UChar* str;
StackType* stk_base;
int i;
StackIndex* mem_start_stk;
StackIndex* mem_end_stk;
i = mem_num;
reg = a->regex;
str = a->string;
stk_base = a->stk_base;
mem_start_stk = a->mem_start_stk;
mem_end_stk = a->mem_end_stk;
if (i > 0) {
if (a->mem_end_stk[i] != INVALID_STACK_INDEX) {
if (MEM_STATUS_AT(reg->bt_mem_start, i))
*begin = (int )(STACK_AT(a->mem_start_stk[i])->u.mem.pstr - str);
else
*begin = (int )((UChar* )((void* )a->mem_start_stk[i]) - str);
*end = (int )((MEM_STATUS_AT(reg->bt_mem_end, i)
? STACK_AT(a->mem_end_stk[i])->u.mem.pstr
: (UChar* )((void* )a->mem_end_stk[i])) - str);
*begin = (int )(STACK_MEM_START(reg, i) - str);
*end = (int )(STACK_MEM_END(reg, i) - str);
}
else {
*begin = *end = ONIG_REGION_NOTPOS;

View File

@ -290,6 +290,8 @@ typedef unsigned int MemStatusType;
#define MEM_STATUS_AT0(stats,n) \
((n) > 0 && (n) < (int )MEM_STATUS_BITS_NUM ? ((stats) & ((MemStatusType )1 << n)) : ((stats) & 1))
#define MEM_STATUS_IS_ALL_ON(stats) (((stats) & 1) != 0)
#define MEM_STATUS_ON(stats,n) do {\
if ((n) < (int )MEM_STATUS_BITS_NUM) {\
if ((n) != 0)\
@ -304,6 +306,14 @@ typedef unsigned int MemStatusType;
(stats) |= ((MemStatusType )1 << (n));\
} while (0)
#define MEM_STATUS_LIMIT_AT(stats,n) \
((n) < (int )MEM_STATUS_BITS_NUM ? ((stats) & ((MemStatusType )1 << n)) : 0)
#define MEM_STATUS_LIMIT_ON(stats,n) do {\
if ((n) < (int )MEM_STATUS_BITS_NUM && (n) != 0) {\
(stats) |= ((MemStatusType )1 << (n));\
}\
} while (0)
#define INT_MAX_LIMIT ((1UL << (SIZEOF_INT * 8 - 1)) - 1)
@ -887,28 +897,29 @@ struct re_pattern_buffer {
#ifdef USE_DIRECT_THREADED_CODE
enum OpCode* ocs;
#endif
Operation* ops_curr;
unsigned int ops_used; /* used space for ops */
unsigned int ops_alloc; /* allocated space for ops */
Operation* ops_curr;
unsigned int ops_used; /* used space for ops */
unsigned int ops_alloc; /* allocated space for ops */
unsigned char* string_pool;
unsigned char* string_pool_end;
int num_mem; /* used memory(...) num counted from 1 */
int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */
int num_null_check; /* OP_EMPTY_CHECK_START/END id counter */
int num_call; /* number of subexp call */
unsigned int capture_history; /* (?@...) flag (1-31) */
unsigned int bt_mem_start; /* need backtrack flag */
unsigned int bt_mem_end; /* need backtrack flag */
int stack_pop_level;
int repeat_range_alloc;
int num_mem; /* used memory(...) num counted from 1 */
int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */
int num_null_check; /* OP_EMPTY_CHECK_START/END id counter */
int num_call; /* number of subexp call */
MemStatusType capture_history; /* (?@...) flag (1-31) */
MemStatusType push_mem_start; /* need backtrack flag */
MemStatusType push_mem_end; /* need backtrack flag */
MemStatusType empty_status_mem;
int stack_pop_level;
int repeat_range_alloc;
OnigRepeatRange* repeat_range;
OnigEncoding enc;
OnigOptionType options;
OnigSyntaxType* syntax;
OnigCaseFoldType case_fold_flag;
void* name_table;
OnigEncoding enc;
OnigOptionType options;
OnigSyntaxType* syntax;
OnigCaseFoldType case_fold_flag;
void* name_table;
/* optimization info (string search, char-map and anchors) */
int optimize; /* optimize flag */

View File

@ -1945,9 +1945,8 @@ callout_tag_entry(ScanEnv* env, regex_t* reg, UChar* name, UChar* name_end,
static void
scan_env_clear(ScanEnv* env)
{
MEM_STATUS_CLEAR(env->capture_history);
MEM_STATUS_CLEAR(env->bt_mem_start);
MEM_STATUS_CLEAR(env->bt_mem_end);
MEM_STATUS_CLEAR(env->cap_history);
MEM_STATUS_CLEAR(env->backtrack_mem);
MEM_STATUS_CLEAR(env->backrefed_mem);
env->error = (UChar* )NULL;
env->error_end = (UChar* )NULL;
@ -1966,6 +1965,7 @@ scan_env_clear(ScanEnv* env)
xmemset(env->mem_env_static, 0, sizeof(env->mem_env_static));
env->parse_depth = 0;
env->backref_num = 0;
env->keep_num = 0;
env->save_num = 0;
env->save_alloc_num = 0;
@ -1997,7 +1997,8 @@ scan_env_add_mem_entry(ScanEnv* env)
}
for (i = env->num_mem + 1; i < alloc; i++) {
p[i].node = NULL_NODE;
p[i].mem_node = NULL_NODE;
p[i].empty_repeat_node = NULL_NODE;
}
env->mem_env_dynamic = p;
@ -2013,7 +2014,7 @@ static int
scan_env_set_mem_node(ScanEnv* env, int num, Node* node)
{
if (env->num_mem >= num)
SCANENV_MEMENV(env)[num].node = node;
SCANENV_MEMENV(env)[num].mem_node = node;
else
return ONIGERR_PARSER_BUG;
return 0;
@ -2326,7 +2327,7 @@ node_new_backref(int back_num, int* backrefs, int by_name,
for (i = 0; i < back_num; i++) {
if (backrefs[i] <= env->num_mem &&
IS_NULL(SCANENV_MEMENV(env)[backrefs[i]].node)) {
IS_NULL(SCANENV_MEMENV(env)[backrefs[i]].mem_node)) {
NODE_STATUS_ADD(node, RECURSION); /* /...(\1).../ */
break;
}
@ -2346,6 +2347,8 @@ node_new_backref(int back_num, int* backrefs, int by_name,
for (i = 0; i < back_num; i++)
p[i] = backrefs[i];
}
env->backref_num++;
return node;
}
@ -2393,13 +2396,13 @@ node_new_quantifier(int lower, int upper, int by_number)
CHECK_NULL_RETURN(node);
NODE_SET_TYPE(node, NODE_QUANT);
QUANT_(node)->lower = lower;
QUANT_(node)->upper = upper;
QUANT_(node)->greedy = 1;
QUANT_(node)->emptiness = BODY_IS_NOT_EMPTY;
QUANT_(node)->head_exact = NULL_NODE;
QUANT_(node)->next_head_exact = NULL_NODE;
QUANT_(node)->is_refered = 0;
QUANT_(node)->lower = lower;
QUANT_(node)->upper = upper;
QUANT_(node)->greedy = 1;
QUANT_(node)->emptiness = BODY_IS_NOT_EMPTY;
QUANT_(node)->head_exact = NULL_NODE;
QUANT_(node)->next_head_exact = NULL_NODE;
QUANT_(node)->include_referred = 0;
if (by_number != 0)
NODE_STATUS_ADD(node, BY_NUMBER);
@ -5270,7 +5273,7 @@ fetch_token(PToken* tok, UChar** src, UChar* end, ScanEnv* env)
if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_DECIMAL_BACKREF) &&
(num <= env->num_mem || num <= 9)) { /* This spec. from GNU regex */
if (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {
if (num > env->num_mem || IS_NULL(SCANENV_MEMENV(env)[num].node))
if (num > env->num_mem || IS_NULL(SCANENV_MEMENV(env)[num].mem_node))
return ONIGERR_INVALID_BACKREF;
}
@ -5341,7 +5344,7 @@ fetch_token(PToken* tok, UChar** src, UChar* end, ScanEnv* env)
if (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {
if (back_num > env->num_mem ||
IS_NULL(SCANENV_MEMENV(env)[back_num].node))
IS_NULL(SCANENV_MEMENV(env)[back_num].mem_node))
return ONIGERR_INVALID_BACKREF;
}
tok->type = TK_BACKREF;
@ -5358,7 +5361,7 @@ fetch_token(PToken* tok, UChar** src, UChar* end, ScanEnv* env)
int i;
for (i = 0; i < num; i++) {
if (backs[i] > env->num_mem ||
IS_NULL(SCANENV_MEMENV(env)[backs[i]].node))
IS_NULL(SCANENV_MEMENV(env)[backs[i]].mem_node))
return ONIGERR_INVALID_BACKREF;
}
}
@ -6045,10 +6048,12 @@ fetch_char_property_to_ctype(UChar** src, UChar* end, ScanEnv* env)
{
int r;
OnigCodePoint c;
OnigEncoding enc = env->enc;
UChar *prev, *start, *p = *src;
OnigEncoding enc;
UChar *prev, *start, *p;
r = 0;
p = *src;
enc = env->enc;
r = ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;
start = prev = p;
while (!PEND) {
@ -6056,18 +6061,20 @@ fetch_char_property_to_ctype(UChar** src, UChar* end, ScanEnv* env)
PFETCH_S(c);
if (c == '}') {
r = ONIGENC_PROPERTY_NAME_TO_CTYPE(enc, start, prev);
if (r < 0) break;
if (r >= 0) {
*src = p;
}
else {
onig_scan_env_set_error_string(env, r, *src, prev);
}
*src = p;
return r;
}
else if (c == '(' || c == ')' || c == '{' || c == '|') {
r = ONIGERR_INVALID_CHAR_PROPERTY_NAME;
break;
}
}
onig_scan_env_set_error_string(env, r, *src, prev);
return r;
}
@ -6230,12 +6237,13 @@ parse_char_class(Node** np, PToken* tok, UChar** src, UChar* end, ScanEnv* env)
Node* node;
CClassNode *cc, *prev_cc;
CClassNode work_cc;
enum CCSTATE state;
enum CCVALTYPE val_type, in_type;
int val_israw, in_israw;
enum CCSTATE state;
enum CCVALTYPE in_type;
enum CCVALTYPE val_type;
*np = NULL_NODE;
val_type = -1;
env->parse_depth++;
if (env->parse_depth > ParseDepthLimit)
return ONIGERR_PARSE_DEPTH_LIMIT_OVER;
@ -6741,7 +6749,8 @@ parse_long(OnigEncoding enc, UChar* s, UChar* end, int sign_on, long max, long*
static int
parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
unsigned int types[], OnigValue vals[], ScanEnv* env)
int max_arg_num, unsigned int types[], OnigValue vals[],
ScanEnv* env)
{
#define MAX_CALLOUT_ARG_BYTE_LENGTH 128
@ -6760,9 +6769,9 @@ parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
if (PEND) return ONIGERR_INVALID_CALLOUT_PATTERN;
c = 0;
n = 0;
while (n < ONIG_CALLOUT_MAX_ARGS_NUM) {
c = 0;
cn = 0;
esc = 0;
eesc = 0;
@ -6809,6 +6818,9 @@ parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
}
if (cn != 0) {
if (max_arg_num >= 0 && n >= max_arg_num)
return ONIGERR_INVALID_CALLOUT_ARG;
if (skip_mode == 0) {
if ((types[n] & ONIG_TYPE_LONG) != 0) {
int fixed = 0;
@ -6941,7 +6953,7 @@ parse_callout_of_name(Node** np, int cterm, UChar** src, UChar* end, ScanEnv* en
/* read for single check only */
save = p;
arg_num = parse_callout_args(1, '}', &p, end, 0, 0, env);
arg_num = parse_callout_args(1, '}', &p, end, -1, 0, 0, env);
if (arg_num < 0) return arg_num;
is_not_single = PPEEK_IS(cterm) ? 0 : 1;
@ -6955,7 +6967,7 @@ parse_callout_of_name(Node** np, int cterm, UChar** src, UChar* end, ScanEnv* en
types[i] = get_callout_arg_type_by_name_id(name_id, i);
}
arg_num = parse_callout_args(0, '}', &p, end, types, vals, env);
arg_num = parse_callout_args(0, '}', &p, end, max_arg_num, types, vals, env);
if (arg_num < 0) return arg_num;
if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
@ -7115,7 +7127,7 @@ parse_bag(Node** np, PToken* tok, int term, UChar** src, UChar* end,
CHECK_NULL_RETURN_MEMERR(*np);
BAG_(*np)->m.regnum = num;
if (list_capture != 0)
MEM_STATUS_ON_SIMPLE(env->capture_history, num);
MEM_STATUS_ON_SIMPLE(env->cap_history, num);
env->num_named++;
}
else {
@ -7257,7 +7269,7 @@ parse_bag(Node** np, PToken* tok, int term, UChar** src, UChar* end,
if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_STRICT_CHECK_BACKREF)) {
if (back_num > env->num_mem ||
IS_NULL(SCANENV_MEMENV(env)[back_num].node))
IS_NULL(SCANENV_MEMENV(env)[back_num].mem_node))
return ONIGERR_INVALID_BACKREF;
}
@ -7279,7 +7291,7 @@ parse_bag(Node** np, PToken* tok, int term, UChar** src, UChar* end,
int i;
for (i = 0; i < num; i++) {
if (backs[i] > env->num_mem ||
IS_NULL(SCANENV_MEMENV(env)[backs[i]].node))
IS_NULL(SCANENV_MEMENV(env)[backs[i]].mem_node))
return ONIGERR_INVALID_BACKREF;
}
}
@ -7434,7 +7446,7 @@ parse_bag(Node** np, PToken* tok, int term, UChar** src, UChar* end,
return ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY;
}
BAG_(*np)->m.regnum = num;
MEM_STATUS_ON_SIMPLE(env->capture_history, num);
MEM_STATUS_ON_SIMPLE(env->cap_history, num);
}
else {
return ONIGERR_UNDEFINED_GROUP_OPTION;

View File

@ -73,9 +73,12 @@ enum BodyEmptyType {
BODY_IS_EMPTY_POSSIBILITY_REC = 3
};
struct _Node;
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
UChar* s;
UChar* end;
@ -87,6 +90,7 @@ typedef struct {
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
unsigned int flags;
BitSet bs;
@ -96,6 +100,7 @@ typedef struct {
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
struct _Node* body;
int lower;
@ -104,12 +109,13 @@ typedef struct {
enum BodyEmptyType emptiness;
struct _Node* head_exact;
struct _Node* next_head_exact;
int is_refered; /* include called node. don't eliminate even if {0} */
int include_referred; /* include called node. don't eliminate even if {0} */
} QuantNode;
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
struct _Node* body;
enum BagType type;
@ -152,6 +158,7 @@ typedef struct {
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
struct _Node* body; /* to BagNode : BAG_MEMORY */
int by_number;
@ -166,6 +173,7 @@ typedef struct {
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
int back_num;
int back_static[NODE_BACKREFS_SIZE];
@ -176,6 +184,7 @@ typedef struct {
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
struct _Node* body;
int type;
@ -186,6 +195,7 @@ typedef struct {
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
struct _Node* car;
struct _Node* cdr;
@ -194,6 +204,7 @@ typedef struct {
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
int ctype;
int not;
@ -204,6 +215,7 @@ typedef struct {
typedef struct {
NodeType node_type;
int status;
struct _Node* parent;
enum GimmickType type;
int detail_type;
@ -216,6 +228,7 @@ typedef struct _Node {
struct {
NodeType node_type;
int status;
struct _Node* parent;
struct _Node* body;
} base;
@ -326,6 +339,7 @@ typedef struct _Node {
#define NODE_ST_FIXED_OPTION (1<<18)
#define NODE_ST_PROHIBIT_RECURSION (1<<19)
#define NODE_ST_SUPER (1<<20)
#define NODE_ST_EMPTY_STATUS_CHECK (1<<21)
#define NODE_STATUS(node) (((Node* )node)->u.base.status)
@ -355,7 +369,10 @@ typedef struct _Node {
((NODE_STATUS(node) & NODE_ST_PROHIBIT_RECURSION) != 0)
#define NODE_IS_STRICT_REAL_REPEAT(node) \
((NODE_STATUS(node) & NODE_ST_STRICT_REAL_REPEAT) != 0)
#define NODE_IS_EMPTY_STATUS_CHECK(node) \
((NODE_STATUS(node) & NODE_ST_EMPTY_STATUS_CHECK) != 0)
#define NODE_PARENT(node) ((node)->u.base.parent)
#define NODE_BODY(node) ((node)->u.base.body)
#define NODE_QUANT_BODY(node) ((node)->body)
#define NODE_BAG_BODY(node) ((node)->body)
@ -368,7 +385,8 @@ typedef struct _Node {
(senv)->mem_env_dynamic : (senv)->mem_env_static)
typedef struct {
Node* node;
Node* mem_node;
Node* empty_repeat_node;
} MemEnv;
typedef struct {
@ -380,9 +398,8 @@ typedef struct {
OnigCaseFoldType case_fold_flag;
OnigEncoding enc;
OnigSyntaxType* syntax;
MemStatusType capture_history;
MemStatusType bt_mem_start;
MemStatusType bt_mem_end;
MemStatusType cap_history;
MemStatusType backtrack_mem; /* backtrack/recursion */
MemStatusType backrefed_mem;
UChar* pattern;
UChar* pattern_end;
@ -400,7 +417,7 @@ typedef struct {
MemEnv mem_env_static[SCANENV_MEMENV_SIZE];
MemEnv* mem_env_dynamic;
unsigned int parse_depth;
int backref_num;
int keep_num;
int save_num;
int save_alloc_num;

View File

@ -3194,7 +3194,7 @@ LRESULT MsgInitMenu(HWND hwnd, WPARAM wParam, LPARAM lParam)
EnableCmd(hmenu,IDM_EDIT_STREAMCOMMENT,
!(i == SCLEX_NULL || i == SCLEX_VBSCRIPT || i == SCLEX_MAKEFILE || i == SCLEX_VB || i == SCLEX_ASM ||
i == SCLEX_SQL || i == SCLEX_PERL || i == SCLEX_PYTHON || i == SCLEX_PROPERTIES ||i == SCLEX_CONF ||
i == SCLEX_PERL || i == SCLEX_PYTHON || i == SCLEX_PROPERTIES ||i == SCLEX_CONF ||
i == SCLEX_POWERSHELL || i == SCLEX_BATCH || i == SCLEX_DIFF || i == SCLEX_BASH || i == SCLEX_TCL ||
i == SCLEX_AU3 || i == SCLEX_LATEX || i == SCLEX_AHKL || i == SCLEX_RUBY || i == SCLEX_CMAKE || i == SCLEX_MARKDOWN ||
i == SCLEX_YAML || i == SCLEX_REGISTRY || i == SCLEX_NIMROD || i == SCLEX_TOML) && !ro);
@ -3530,6 +3530,9 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
case IDM_FILE_PRESERVE_FILEMODTIME:
if (!Flags.bPreserveFileModTime) {
InfoBoxLng(MB_OK, L"PreserveFileModTime", IDS_MUI_INF_PRSVFILEMODTM);
}
Flags.bPreserveFileModTime = true;
FileSave(true, false, false, false, Flags.bPreserveFileModTime);
break;
@ -4520,8 +4523,8 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
case SCLEX_REGISTRY:
EditToggleLineComments(Globals.hwndEdit, L";", true);
break;
case SCLEX_SQL:
case SCLEX_LUA:
case SCLEX_SQL:
case SCLEX_VHDL:
EditToggleLineComments(Globals.hwndEdit, L"--", true);
break;
@ -4549,7 +4552,6 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
case SCLEX_MAKEFILE:
case SCLEX_VB:
case SCLEX_ASM:
case SCLEX_SQL:
case SCLEX_PERL:
case SCLEX_PYTHON:
case SCLEX_PROPERTIES:
@ -4571,17 +4573,18 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
case SCLEX_NIMROD:
case SCLEX_TOML:
break;
case SCLEX_HTML:
case SCLEX_XML:
case SCLEX_CSS:
case SCLEX_CPP:
case SCLEX_NSIS:
case SCLEX_AVS:
case SCLEX_CPP:
case SCLEX_CSS:
case SCLEX_HTML:
case SCLEX_NSIS:
case SCLEX_SQL:
case SCLEX_VHDL:
case SCLEX_XML:
EditEncloseSelection(Globals.hwndEdit, L"/*", L"*/");
break;
case SCLEX_PASCAL:
case SCLEX_INNOSETUP:
case SCLEX_PASCAL:
EditEncloseSelection(Globals.hwndEdit, L"{", L"}");
break;
case SCLEX_LUA:

View File

@ -884,10 +884,6 @@ void Style_SetLexerSpecificProperties(const int lexerId)
{
switch (lexerId)
{
case SCLEX_XML:
SciCall_SetProperty("lexer.xml.allow.scripts", "1");
break;
case SCLEX_CPP:
SciCall_SetProperty("styling.within.preprocessor", "1");
SciCall_SetProperty("lexer.cpp.track.preprocessor", "0");
@ -922,6 +918,10 @@ void Style_SetLexerSpecificProperties(const int lexerId)
SciCall_SetProperty("tab.timmy.whinge.level", "1");
break;
case SCLEX_XML:
SciCall_SetProperty("lexer.xml.allow.scripts", "1");
break;
default:
break;
}