| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.600 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.600 |
| Problem: Memory wasted in struct because of aligning. |
| Solution: Split pos in lnum and col. (Dominique Pelle) |
| Files: src/regexp_nfa.c |
| |
| |
| |
| |
| |
| *** 1456,1462 **** |
| * matched an unlimited number of times. NFA_NOPEN is |
| * added only once at a position, while NFA_SPLIT is |
| * added multiple times. This is more efficient than |
| ! * not allowsing NFA_SPLIT multiple times, it is used |
| * a lot. */ |
| EMIT(NFA_NOPEN); |
| break; |
| --- 1456,1462 ---- |
| * matched an unlimited number of times. NFA_NOPEN is |
| * added only once at a position, while NFA_SPLIT is |
| * added multiple times. This is more efficient than |
| ! * not allowing NFA_SPLIT multiple times, it is used |
| * a lot. */ |
| EMIT(NFA_NOPEN); |
| break; |
| |
| *** 3726,3733 **** |
| { |
| struct multipos |
| { |
| ! lpos_T start; |
| ! lpos_T end; |
| } multi[NSUBEXP]; |
| struct linepos |
| { |
| --- 3726,3735 ---- |
| { |
| struct multipos |
| { |
| ! linenr_T start_lnum; |
| ! linenr_T end_lnum; |
| ! colnr_T start_col; |
| ! colnr_T end_col; |
| } multi[NSUBEXP]; |
| struct linepos |
| { |
| |
| *** 3812,3821 **** |
| if (REG_MULTI) |
| fprintf(log_fd, "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n", |
| j, |
| ! sub->list.multi[j].start.col, |
| ! (int)sub->list.multi[j].start.lnum, |
| ! sub->list.multi[j].end.col, |
| ! (int)sub->list.multi[j].end.lnum); |
| else |
| { |
| char *s = (char *)sub->list.line[j].start; |
| --- 3814,3823 ---- |
| if (REG_MULTI) |
| fprintf(log_fd, "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n", |
| j, |
| ! sub->list.multi[j].start_col, |
| ! (int)sub->list.multi[j].start_lnum, |
| ! sub->list.multi[j].end_col, |
| ! (int)sub->list.multi[j].end_lnum); |
| else |
| { |
| char *s = (char *)sub->list.line[j].start; |
| |
| *** 3952,3959 **** |
| { |
| if (REG_MULTI) |
| { |
| ! if (from->list.multi[0].end.lnum >= 0) |
| ! to->list.multi[0].end = from->list.multi[0].end; |
| } |
| else |
| { |
| --- 3954,3964 ---- |
| { |
| if (REG_MULTI) |
| { |
| ! if (from->list.multi[0].end_lnum >= 0) |
| ! { |
| ! to->list.multi[0].end_lnum = from->list.multi[0].end_lnum; |
| ! to->list.multi[0].end_col = from->list.multi[0].end_col; |
| ! } |
| } |
| else |
| { |
| |
| *** 3985,4017 **** |
| for (i = 0; i < todo; ++i) |
| { |
| if (i < sub1->in_use) |
| ! s1 = sub1->list.multi[i].start.lnum; |
| else |
| s1 = -1; |
| if (i < sub2->in_use) |
| ! s2 = sub2->list.multi[i].start.lnum; |
| else |
| s2 = -1; |
| if (s1 != s2) |
| return FALSE; |
| ! if (s1 != -1 && sub1->list.multi[i].start.col |
| ! != sub2->list.multi[i].start.col) |
| return FALSE; |
| |
| if (nfa_has_backref) |
| { |
| if (i < sub1->in_use) |
| ! s1 = sub1->list.multi[i].end.lnum; |
| else |
| s1 = -1; |
| if (i < sub2->in_use) |
| ! s2 = sub2->list.multi[i].end.lnum; |
| else |
| s2 = -1; |
| if (s1 != s2) |
| return FALSE; |
| ! if (s1 != -1 && sub1->list.multi[i].end.col |
| ! != sub2->list.multi[i].end.col) |
| return FALSE; |
| } |
| } |
| --- 3990,4022 ---- |
| for (i = 0; i < todo; ++i) |
| { |
| if (i < sub1->in_use) |
| ! s1 = sub1->list.multi[i].start_lnum; |
| else |
| s1 = -1; |
| if (i < sub2->in_use) |
| ! s2 = sub2->list.multi[i].start_lnum; |
| else |
| s2 = -1; |
| if (s1 != s2) |
| return FALSE; |
| ! if (s1 != -1 && sub1->list.multi[i].start_col |
| ! != sub2->list.multi[i].start_col) |
| return FALSE; |
| |
| if (nfa_has_backref) |
| { |
| if (i < sub1->in_use) |
| ! s1 = sub1->list.multi[i].end_lnum; |
| else |
| s1 = -1; |
| if (i < sub2->in_use) |
| ! s2 = sub2->list.multi[i].end_lnum; |
| else |
| s2 = -1; |
| if (s1 != s2) |
| return FALSE; |
| ! if (s1 != -1 && sub1->list.multi[i].end_col |
| ! != sub2->list.multi[i].end_col) |
| return FALSE; |
| } |
| } |
| |
| *** 4062,4068 **** |
| if (sub->in_use <= 0) |
| col = -1; |
| else if (REG_MULTI) |
| ! col = sub->list.multi[0].start.col; |
| else |
| col = (int)(sub->list.line[0].start - regline); |
| nfa_set_code(state->c); |
| --- 4067,4073 ---- |
| if (sub->in_use <= 0) |
| col = -1; |
| else if (REG_MULTI) |
| ! col = sub->list.multi[0].start_col; |
| else |
| col = (int)(sub->list.line[0].start - regline); |
| nfa_set_code(state->c); |
| |
| *** 4482,4488 **** |
| { |
| if (subidx < sub->in_use) |
| { |
| ! save_lpos = sub->list.multi[subidx].start; |
| save_in_use = -1; |
| } |
| else |
| --- 4487,4494 ---- |
| { |
| if (subidx < sub->in_use) |
| { |
| ! save_lpos.lnum = sub->list.multi[subidx].start_lnum; |
| ! save_lpos.col = sub->list.multi[subidx].start_col; |
| save_in_use = -1; |
| } |
| else |
| |
| *** 4490,4509 **** |
| save_in_use = sub->in_use; |
| for (i = sub->in_use; i < subidx; ++i) |
| { |
| ! sub->list.multi[i].start.lnum = -1; |
| ! sub->list.multi[i].end.lnum = -1; |
| } |
| sub->in_use = subidx + 1; |
| } |
| if (off == -1) |
| { |
| ! sub->list.multi[subidx].start.lnum = reglnum + 1; |
| ! sub->list.multi[subidx].start.col = 0; |
| } |
| else |
| { |
| ! sub->list.multi[subidx].start.lnum = reglnum; |
| ! sub->list.multi[subidx].start.col = |
| (colnr_T)(reginput - regline + off); |
| } |
| } |
| --- 4496,4515 ---- |
| save_in_use = sub->in_use; |
| for (i = sub->in_use; i < subidx; ++i) |
| { |
| ! sub->list.multi[i].start_lnum = -1; |
| ! sub->list.multi[i].end_lnum = -1; |
| } |
| sub->in_use = subidx + 1; |
| } |
| if (off == -1) |
| { |
| ! sub->list.multi[subidx].start_lnum = reglnum + 1; |
| ! sub->list.multi[subidx].start_col = 0; |
| } |
| else |
| { |
| ! sub->list.multi[subidx].start_lnum = reglnum; |
| ! sub->list.multi[subidx].start_col = |
| (colnr_T)(reginput - regline + off); |
| } |
| } |
| |
| *** 4539,4545 **** |
| if (save_in_use == -1) |
| { |
| if (REG_MULTI) |
| ! sub->list.multi[subidx].start = save_lpos; |
| else |
| sub->list.line[subidx].start = save_ptr; |
| } |
| --- 4545,4554 ---- |
| if (save_in_use == -1) |
| { |
| if (REG_MULTI) |
| ! { |
| ! sub->list.multi[subidx].start_lnum = save_lpos.lnum; |
| ! sub->list.multi[subidx].start_col = save_lpos.col; |
| ! } |
| else |
| sub->list.line[subidx].start = save_ptr; |
| } |
| |
| *** 4549,4555 **** |
| |
| case NFA_MCLOSE: |
| if (nfa_has_zend && (REG_MULTI |
| ! ? subs->norm.list.multi[0].end.lnum >= 0 |
| : subs->norm.list.line[0].end != NULL)) |
| { |
| /* Do not overwrite the position set by \ze. */ |
| --- 4558,4564 ---- |
| |
| case NFA_MCLOSE: |
| if (nfa_has_zend && (REG_MULTI |
| ! ? subs->norm.list.multi[0].end_lnum >= 0 |
| : subs->norm.list.line[0].end != NULL)) |
| { |
| /* Do not overwrite the position set by \ze. */ |
| |
| *** 4603,4618 **** |
| sub->in_use = subidx + 1; |
| if (REG_MULTI) |
| { |
| ! save_lpos = sub->list.multi[subidx].end; |
| if (off == -1) |
| { |
| ! sub->list.multi[subidx].end.lnum = reglnum + 1; |
| ! sub->list.multi[subidx].end.col = 0; |
| } |
| else |
| { |
| ! sub->list.multi[subidx].end.lnum = reglnum; |
| ! sub->list.multi[subidx].end.col = |
| (colnr_T)(reginput - regline + off); |
| } |
| /* avoid compiler warnings */ |
| --- 4612,4628 ---- |
| sub->in_use = subidx + 1; |
| if (REG_MULTI) |
| { |
| ! save_lpos.lnum = sub->list.multi[subidx].end_lnum; |
| ! save_lpos.col = sub->list.multi[subidx].end_col; |
| if (off == -1) |
| { |
| ! sub->list.multi[subidx].end_lnum = reglnum + 1; |
| ! sub->list.multi[subidx].end_col = 0; |
| } |
| else |
| { |
| ! sub->list.multi[subidx].end_lnum = reglnum; |
| ! sub->list.multi[subidx].end_col = |
| (colnr_T)(reginput - regline + off); |
| } |
| /* avoid compiler warnings */ |
| |
| *** 4637,4643 **** |
| sub = &subs->norm; |
| |
| if (REG_MULTI) |
| ! sub->list.multi[subidx].end = save_lpos; |
| else |
| sub->list.line[subidx].end = save_ptr; |
| sub->in_use = save_in_use; |
| --- 4647,4656 ---- |
| sub = &subs->norm; |
| |
| if (REG_MULTI) |
| ! { |
| ! sub->list.multi[subidx].end_lnum = save_lpos.lnum; |
| ! sub->list.multi[subidx].end_col = save_lpos.col; |
| ! } |
| else |
| sub->list.line[subidx].end = save_ptr; |
| sub->in_use = save_in_use; |
| |
| *** 4825,4839 **** |
| |
| if (REG_MULTI) |
| { |
| ! if (sub->list.multi[subidx].start.lnum < 0 |
| ! || sub->list.multi[subidx].end.lnum < 0) |
| goto retempty; |
| ! if (sub->list.multi[subidx].start.lnum == reglnum |
| ! && sub->list.multi[subidx].end.lnum == reglnum) |
| { |
| ! len = sub->list.multi[subidx].end.col |
| ! - sub->list.multi[subidx].start.col; |
| ! if (cstrncmp(regline + sub->list.multi[subidx].start.col, |
| reginput, &len) == 0) |
| { |
| *bytelen = len; |
| --- 4838,4852 ---- |
| |
| if (REG_MULTI) |
| { |
| ! if (sub->list.multi[subidx].start_lnum < 0 |
| ! || sub->list.multi[subidx].end_lnum < 0) |
| goto retempty; |
| ! if (sub->list.multi[subidx].start_lnum == reglnum |
| ! && sub->list.multi[subidx].end_lnum == reglnum) |
| { |
| ! len = sub->list.multi[subidx].end_col |
| ! - sub->list.multi[subidx].start_col; |
| ! if (cstrncmp(regline + sub->list.multi[subidx].start_col, |
| reginput, &len) == 0) |
| { |
| *bytelen = len; |
| |
| *** 4843,4852 **** |
| else |
| { |
| if (match_with_backref( |
| ! sub->list.multi[subidx].start.lnum, |
| ! sub->list.multi[subidx].start.col, |
| ! sub->list.multi[subidx].end.lnum, |
| ! sub->list.multi[subidx].end.col, |
| bytelen) == RA_MATCH) |
| return TRUE; |
| } |
| --- 4856,4865 ---- |
| else |
| { |
| if (match_with_backref( |
| ! sub->list.multi[subidx].start_lnum, |
| ! sub->list.multi[subidx].start_col, |
| ! sub->list.multi[subidx].end_lnum, |
| ! sub->list.multi[subidx].end_col, |
| bytelen) == RA_MATCH) |
| return TRUE; |
| } |
| |
| *** 5441,5446 **** |
| --- 5454,5460 ---- |
| |
| /* Allocate memory for the lists of nodes. */ |
| size = (nstate + 1) * sizeof(nfa_thread_T); |
| + |
| list[0].t = (nfa_thread_T *)lalloc(size, TRUE); |
| list[0].len = nstate + 1; |
| list[1].t = (nfa_thread_T *)lalloc(size, TRUE); |
| |
| *** 5482,5489 **** |
| { |
| if (REG_MULTI) |
| { |
| ! m->norm.list.multi[0].start.lnum = reglnum; |
| ! m->norm.list.multi[0].start.col = (colnr_T)(reginput - regline); |
| } |
| else |
| m->norm.list.line[0].start = reginput; |
| --- 5496,5503 ---- |
| { |
| if (REG_MULTI) |
| { |
| ! m->norm.list.multi[0].start_lnum = reglnum; |
| ! m->norm.list.multi[0].start_col = (colnr_T)(reginput - regline); |
| } |
| else |
| m->norm.list.line[0].start = reginput; |
| |
| *** 5580,5586 **** |
| if (t->subs.norm.in_use <= 0) |
| col = -1; |
| else if (REG_MULTI) |
| ! col = t->subs.norm.list.multi[0].start.col; |
| else |
| col = (int)(t->subs.norm.list.line[0].start - regline); |
| nfa_set_code(t->state->c); |
| --- 5594,5600 ---- |
| if (t->subs.norm.in_use <= 0) |
| col = -1; |
| else if (REG_MULTI) |
| ! col = t->subs.norm.list.multi[0].start_col; |
| else |
| col = (int)(t->subs.norm.list.line[0].start - regline); |
| nfa_set_code(t->state->c); |
| |
| *** 5861,5867 **** |
| * continue with what follows. */ |
| if (REG_MULTI) |
| /* TODO: multi-line match */ |
| ! bytelen = m->norm.list.multi[0].end.col |
| - (int)(reginput - regline); |
| else |
| bytelen = (int)(m->norm.list.line[0].end - reginput); |
| --- 5875,5881 ---- |
| * continue with what follows. */ |
| if (REG_MULTI) |
| /* TODO: multi-line match */ |
| ! bytelen = m->norm.list.multi[0].end_col |
| - (int)(reginput - regline); |
| else |
| bytelen = (int)(m->norm.list.line[0].end - reginput); |
| |
| *** 6741,6747 **** |
| if (add) |
| { |
| if (REG_MULTI) |
| ! m->norm.list.multi[0].start.col = |
| (colnr_T)(reginput - regline) + clen; |
| else |
| m->norm.list.line[0].start = reginput + clen; |
| --- 6755,6761 ---- |
| if (add) |
| { |
| if (REG_MULTI) |
| ! m->norm.list.multi[0].start_col = |
| (colnr_T)(reginput - regline) + clen; |
| else |
| m->norm.list.line[0].start = reginput + clen; |
| |
| *** 6854,6861 **** |
| { |
| for (i = 0; i < subs.norm.in_use; i++) |
| { |
| ! reg_startpos[i] = subs.norm.list.multi[i].start; |
| ! reg_endpos[i] = subs.norm.list.multi[i].end; |
| } |
| |
| if (reg_startpos[0].lnum < 0) |
| --- 6868,6878 ---- |
| { |
| for (i = 0; i < subs.norm.in_use; i++) |
| { |
| ! reg_startpos[i].lnum = subs.norm.list.multi[i].start_lnum; |
| ! reg_startpos[i].col = subs.norm.list.multi[i].start_col; |
| ! |
| ! reg_endpos[i].lnum = subs.norm.list.multi[i].end_lnum; |
| ! reg_endpos[i].col = subs.norm.list.multi[i].end_col; |
| } |
| |
| if (reg_startpos[0].lnum < 0) |
| |
| *** 6903,6915 **** |
| struct multipos *mpos = &subs.synt.list.multi[i]; |
| |
| /* Only accept single line matches that are valid. */ |
| ! if (mpos->start.lnum >= 0 |
| ! && mpos->start.lnum == mpos->end.lnum |
| ! && mpos->end.col >= mpos->start.col) |
| re_extmatch_out->matches[i] = |
| ! vim_strnsave(reg_getline(mpos->start.lnum) |
| ! + mpos->start.col, |
| ! mpos->end.col - mpos->start.col); |
| } |
| else |
| { |
| --- 6920,6932 ---- |
| struct multipos *mpos = &subs.synt.list.multi[i]; |
| |
| /* Only accept single line matches that are valid. */ |
| ! if (mpos->start_lnum >= 0 |
| ! && mpos->start_lnum == mpos->end_lnum |
| ! && mpos->end_col >= mpos->start_col) |
| re_extmatch_out->matches[i] = |
| ! vim_strnsave(reg_getline(mpos->start_lnum) |
| ! + mpos->start_col, |
| ! mpos->end_col - mpos->start_col); |
| } |
| else |
| { |
| |
| |
| |
| *** 743,744 **** |
| --- 743,746 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 600, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 126. You brag to all of your friends about your date Saturday night...but |
| you don't tell them it was only in a chat room. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |