Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
cs24-19fa
git_rec_nano
Commits
f6fbc157
Commit
f6fbc157
authored
8 years ago
by
Benno Schulenberg
Browse files
Options
Download
Email Patches
Plain Diff
tweaks: adjust whitespace after the previous change
parent
38d7362f
master
feature/match-parens
refactor/readbility
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/winio.c
+143
-152
src/winio.c
with
143 additions
and
152 deletions
+143
-152
src/winio.c
View file @
f6fbc157
...
...
@@ -2398,217 +2398,208 @@ void edit_draw(filestruct *fileptr, const char *converted, int
startmatch
.
rm_eo
<=
from_x
)
continue
;
{
start_col
=
(
startmatch
.
rm_so
<=
from_x
)
?
start_col
=
(
startmatch
.
rm_so
<=
from_x
)
?
0
:
strnlenpt
(
fileptr
->
data
,
startmatch
.
rm_so
)
-
from_col
;
thetext
=
converted
+
actual_x
(
converted
,
start_col
);
thetext
=
converted
+
actual_x
(
converted
,
start_col
);
paintlen
=
actual_x
(
thetext
,
strnlenpt
(
fileptr
->
data
,
paintlen
=
actual_x
(
thetext
,
strnlenpt
(
fileptr
->
data
,
startmatch
.
rm_eo
)
-
from_col
-
start_col
);
mvwaddnstr
(
edit
,
line
,
margin
+
start_col
,
mvwaddnstr
(
edit
,
line
,
margin
+
start_col
,
thetext
,
paintlen
);
}
}
goto
tail_of_loop
;
}
/* Second case: varnish is a multiline expression. */
{
const
filestruct
*
start_line
=
fileptr
->
prev
;
/* The first line before fileptr that matches 'start'. */
const
filestruct
*
end_line
=
fileptr
;
/* The line that matches 'end'. */
/* First see if the multidata was maybe already calculated. */
if
(
fileptr
->
multidata
[
varnish
->
id
]
==
CNONE
)
goto
tail_of_loop
;
else
if
(
fileptr
->
multidata
[
varnish
->
id
]
==
CWHOLELINE
)
{
mvwaddnstr
(
edit
,
line
,
margin
,
converted
,
-
1
);
const
filestruct
*
start_line
=
fileptr
->
prev
;
/* The first line before fileptr that matches 'start'. */
const
filestruct
*
end_line
=
fileptr
;
/* The line that matches 'end'. */
/* First see if the multidata was maybe already calculated. */
if
(
fileptr
->
multidata
[
varnish
->
id
]
==
CNONE
)
goto
tail_of_loop
;
else
if
(
fileptr
->
multidata
[
varnish
->
id
]
==
CWHOLELINE
)
{
mvwaddnstr
(
edit
,
line
,
margin
,
converted
,
-
1
);
goto
tail_of_loop
;
}
else
if
(
fileptr
->
multidata
[
varnish
->
id
]
==
CBEGINBEFORE
)
{
regexec
(
varnish
->
end
,
fileptr
->
data
,
1
,
&
endmatch
,
0
);
/* If the coloured part is scrolled off, skip it. */
if
(
endmatch
.
rm_eo
<=
from_x
)
goto
tail_of_loop
;
}
else
if
(
fileptr
->
multidata
[
varnish
->
id
]
==
CBEGINBEFORE
)
{
regexec
(
varnish
->
end
,
fileptr
->
data
,
1
,
&
endmatch
,
0
);
/* If the coloured part is scrolled off, skip it. */
if
(
endmatch
.
rm_eo
<=
from_x
)
goto
tail_of_loop
;
paintlen
=
actual_x
(
converted
,
strnlenpt
(
fileptr
->
data
,
paintlen
=
actual_x
(
converted
,
strnlenpt
(
fileptr
->
data
,
endmatch
.
rm_eo
)
-
from_col
);
mvwaddnstr
(
edit
,
line
,
margin
,
converted
,
paintlen
);
goto
tail_of_loop
;
}
/* There is no precalculated multidata, or it is CENDAFTER or
* CSTARTENDHERE. In all cases, find out what to paint. */
/* When the multidata is unitialized, assume CNONE until one
* of the steps below concludes otherwise. */
if
(
fileptr
->
multidata
[
varnish
->
id
]
==
-
1
)
fileptr
->
multidata
[
varnish
->
id
]
=
CNONE
;
/* First check if the beginning of the line is colored by a
* start on an earlier line, and an end on this line or later.
*
* So: find the first line before fileptr matching the start.
* If every match on that line is followed by an end, then go
* to step two. Otherwise, find a line after start_line that
* matches the end. If that line is not before fileptr, then
* paint the beginning of this line. */
while
(
start_line
!=
NULL
&&
regexec
(
varnish
->
start
,
start_line
->
data
,
1
,
&
startmatch
,
0
)
==
REG_NOMATCH
)
{
/* There is no start; but if there is an end on this line,
* there is no need to look for starts on earlier lines. */
if
(
regexec
(
varnish
->
end
,
start_line
->
data
,
0
,
NULL
,
0
)
==
0
)
goto
step_two
;
start_line
=
start_line
->
prev
;
}
mvwaddnstr
(
edit
,
line
,
margin
,
converted
,
paintlen
);
goto
tail_of_loop
;
}
/* If no start was found, skip to the next step. */
if
(
start_line
==
NULL
)
/* There is no precalculated multidata, or it is CENDAFTER or
* CSTARTENDHERE. In all cases, find out what to paint. */
/* When the multidata is unitialized, assume CNONE until one
* of the steps below concludes otherwise. */
if
(
fileptr
->
multidata
[
varnish
->
id
]
==
-
1
)
fileptr
->
multidata
[
varnish
->
id
]
=
CNONE
;
/* First check if the beginning of the line is colored by a
* start on an earlier line, and an end on this line or later.
*
* So: find the first line before fileptr matching the start.
* If every match on that line is followed by an end, then go
* to step two. Otherwise, find a line after start_line that
* matches the end. If that line is not before fileptr, then
* paint the beginning of this line. */
while
(
start_line
!=
NULL
&&
regexec
(
varnish
->
start
,
start_line
->
data
,
1
,
&
startmatch
,
0
)
==
REG_NOMATCH
)
{
/* There is no start; but if there is an end on this line,
* there is no need to look for starts on earlier lines. */
if
(
regexec
(
varnish
->
end
,
start_line
->
data
,
0
,
NULL
,
0
)
==
0
)
goto
step_two
;
start_line
=
start_line
->
prev
;
}
/* If a found start has been qualified as an end earlier,
* believe it and skip to the next step. */
if
(
start_line
->
multidata
!=
NULL
&&
/* If no start was found, skip to the next step. */
if
(
start_line
==
NULL
)
goto
step_two
;
/* If a found start has been qualified as an end earlier,
* believe it and skip to the next step. */
if
(
start_line
->
multidata
!=
NULL
&&
(
start_line
->
multidata
[
varnish
->
id
]
==
CBEGINBEFORE
||
start_line
->
multidata
[
varnish
->
id
]
==
CSTARTENDHERE
))
goto
step_two
;
goto
step_two
;
/* Skip over a zero-length regex match. */
if
(
startmatch
.
rm_so
==
startmatch
.
rm_eo
)
goto
tail_of_loop
;
/* Skip over a zero-length regex match. */
if
(
startmatch
.
rm_so
==
startmatch
.
rm_eo
)
goto
tail_of_loop
;
/* Now start_line is the first line before fileptr containing
* a start match. Is there a start on that line not followed
* by an end on that line? */
while
(
TRUE
)
{
index
+=
startmatch
.
rm_so
;
startmatch
.
rm_eo
-=
startmatch
.
rm_so
;
if
(
regexec
(
varnish
->
end
,
start_line
->
data
+
/* Now start_line is the first line before fileptr containing
* a start match. Is there a start on that line not followed
* by an end on that line? */
while
(
TRUE
)
{
index
+=
startmatch
.
rm_so
;
startmatch
.
rm_eo
-=
startmatch
.
rm_so
;
if
(
regexec
(
varnish
->
end
,
start_line
->
data
+
index
+
startmatch
.
rm_eo
,
0
,
NULL
,
(
index
+
startmatch
.
rm_eo
==
0
)
?
0
:
REG_NOTBOL
)
==
REG_NOMATCH
)
/* No end found after this start. */
break
;
index
++
;
if
(
regexec
(
varnish
->
start
,
start_line
->
data
+
index
,
/* No end found after this start. */
break
;
index
++
;
if
(
regexec
(
varnish
->
start
,
start_line
->
data
+
index
,
1
,
&
startmatch
,
REG_NOTBOL
)
==
REG_NOMATCH
)
/* No later start on this line. */
goto
step_two
;
}
/* Indeed, there is a start without an end on that line. */
/* We've already checked that there is no end before fileptr
* and after the start. But is there an end after the start
* at all? We don't paint unterminated starts. */
while
(
end_line
!=
NULL
&&
regexec
(
varnish
->
end
,
end_line
->
data
,
1
,
&
endmatch
,
0
)
==
REG_NOMATCH
)
end_line
=
end_line
->
next
;
/* If no end was found, or it is too early, next step. */
if
(
end_line
==
NULL
)
goto
step_two
;
if
(
end_line
==
fileptr
&&
endmatch
.
rm_eo
<=
from_x
)
{
fileptr
->
multidata
[
varnish
->
id
]
=
CBEGINBEFORE
;
/* No later start on this line. */
goto
step_two
;
}
}
/* Indeed, there is a start without an end on that line. */
/* We've already checked that there is no end before fileptr
* and after the start. But is there an end after the start
* at all? We don't paint unterminated starts. */
while
(
end_line
!=
NULL
&&
regexec
(
varnish
->
end
,
end_line
->
data
,
1
,
&
endmatch
,
0
)
==
REG_NOMATCH
)
end_line
=
end_line
->
next
;
/* If no end was found, or it is too early, next step. */
if
(
end_line
==
NULL
)
goto
step_two
;
if
(
end_line
==
fileptr
&&
endmatch
.
rm_eo
<=
from_x
)
{
fileptr
->
multidata
[
varnish
->
id
]
=
CBEGINBEFORE
;
goto
step_two
;
}
/* Now paint the start of the line. However, if the end match
* is on a different line, paint the whole line, and go on. */
if
(
end_line
!=
fileptr
)
{
mvwaddnstr
(
edit
,
line
,
margin
,
converted
,
-
1
);
fileptr
->
multidata
[
varnish
->
id
]
=
CWHOLELINE
;
/* Now paint the start of the line. However, if the end match
* is on a different line, paint the whole line, and go on. */
if
(
end_line
!=
fileptr
)
{
mvwaddnstr
(
edit
,
line
,
margin
,
converted
,
-
1
);
fileptr
->
multidata
[
varnish
->
id
]
=
CWHOLELINE
;
#ifdef DEBUG
fprintf
(
stderr
,
" Marking for id %i line %i as CWHOLELINE
\n
"
,
varnish
->
id
,
line
);
#endif
/* Don't bother looking for any more starts. */
goto
tail_of_loop
;
}
else
{
paintlen
=
actual_x
(
converted
,
strnlenpt
(
fileptr
->
data
,
/* Don't bother looking for any more starts. */
goto
tail_of_loop
;
}
else
{
paintlen
=
actual_x
(
converted
,
strnlenpt
(
fileptr
->
data
,
endmatch
.
rm_eo
)
-
from_col
);
mvwaddnstr
(
edit
,
line
,
margin
,
converted
,
paintlen
);
fileptr
->
multidata
[
varnish
->
id
]
=
CBEGINBEFORE
;
mvwaddnstr
(
edit
,
line
,
margin
,
converted
,
paintlen
);
fileptr
->
multidata
[
varnish
->
id
]
=
CBEGINBEFORE
;
#ifdef DEBUG
fprintf
(
stderr
,
" Marking for id %i line %i as CBEGINBEFORE
\n
"
,
varnish
->
id
,
line
);
#endif
}
}
step_two:
/* Second step: look for starts on this line, but begin
* looking only after an end match, if there is one. */
index
=
(
paintlen
==
0
)
?
0
:
endmatch
.
rm_eo
;
/* Second step: look for starts on this line, but begin
* looking only after an end match, if there is one. */
index
=
(
paintlen
==
0
)
?
0
:
endmatch
.
rm_eo
;
while
(
regexec
(
varnish
->
start
,
fileptr
->
data
+
index
,
while
(
regexec
(
varnish
->
start
,
fileptr
->
data
+
index
,
1
,
&
startmatch
,
(
index
==
0
)
?
0
:
REG_NOTBOL
)
==
0
)
{
/* Translate the match to be relative to the
* beginning of the line. */
startmatch
.
rm_so
+=
index
;
startmatch
.
rm_eo
+=
index
;
/* Translate the match to be relative to the
* beginning of the line. */
startmatch
.
rm_so
+=
index
;
startmatch
.
rm_eo
+=
index
;
start_col
=
(
startmatch
.
rm_so
<=
from_x
)
?
start_col
=
(
startmatch
.
rm_so
<=
from_x
)
?
0
:
strnlenpt
(
fileptr
->
data
,
startmatch
.
rm_so
)
-
from_col
;
thetext
=
converted
+
actual_x
(
converted
,
start_col
);
thetext
=
converted
+
actual_x
(
converted
,
start_col
);
if
(
regexec
(
varnish
->
end
,
fileptr
->
data
+
startmatch
.
rm_eo
,
1
,
&
endmatch
,
(
startmatch
.
rm_eo
==
0
)
?
if
(
regexec
(
varnish
->
end
,
fileptr
->
data
+
startmatch
.
rm_eo
,
1
,
&
endmatch
,
(
startmatch
.
rm_eo
==
0
)
?
0
:
REG_NOTBOL
)
==
0
)
{
/* Translate the end match to be relative to
* the beginning of the line. */
endmatch
.
rm_so
+=
startmatch
.
rm_eo
;
endmatch
.
rm_eo
+=
startmatch
.
rm_eo
;
/* There is an end on this line. But does
* it appear on this page, and is the match
* more than zero characters long? */
if
(
endmatch
.
rm_eo
>
from_x
&&
/* Translate the end match to be relative to
* the beginning of the line. */
endmatch
.
rm_so
+=
startmatch
.
rm_eo
;
endmatch
.
rm_eo
+=
startmatch
.
rm_eo
;
/* There is an end on this line. But does
* it appear on this page, and is the match
* more than zero characters long? */
if
(
endmatch
.
rm_eo
>
from_x
&&
endmatch
.
rm_eo
>
startmatch
.
rm_so
)
{
paintlen
=
actual_x
(
thetext
,
strnlenpt
(
fileptr
->
data
,
paintlen
=
actual_x
(
thetext
,
strnlenpt
(
fileptr
->
data
,
endmatch
.
rm_eo
)
-
from_col
-
start_col
);
mvwaddnstr
(
edit
,
line
,
margin
+
start_col
,
thetext
,
paintlen
);
mvwaddnstr
(
edit
,
line
,
margin
+
start_col
,
thetext
,
paintlen
);
fileptr
->
multidata
[
varnish
->
id
]
=
CSTARTENDHERE
;
fileptr
->
multidata
[
varnish
->
id
]
=
CSTARTENDHERE
;
#ifdef DEBUG
fprintf
(
stderr
,
" Marking for id %i line %i as CSTARTENDHERE
\n
"
,
varnish
->
id
,
line
);
#endif
}
index
=
endmatch
.
rm_eo
;
/* Skip over a zero-length match. */
if
(
endmatch
.
rm_so
==
endmatch
.
rm_eo
)
index
+=
1
;
continue
;
}
index
=
endmatch
.
rm_eo
;
/* Skip over a zero-length match. */
if
(
endmatch
.
rm_so
==
endmatch
.
rm_eo
)
index
+=
1
;
continue
;
}
{
/* There is no end on this line. But we haven't yet
* looked for one on later lines. */
end_line
=
fileptr
->
next
;
/* There is no end on this line. But maybe on later lines? */
end_line
=
fileptr
->
next
;
while
(
end_line
!=
NULL
&&
regexec
(
varnish
->
end
,
end_line
->
data
,
0
,
NULL
,
0
)
==
REG_NOMATCH
)
end_line
=
end_line
->
next
;
while
(
end_line
!=
NULL
&&
regexec
(
varnish
->
end
,
end_line
->
data
,
0
,
NULL
,
0
)
==
REG_NOMATCH
)
end_line
=
end_line
->
next
;
/* If there is no end, we're done
on
this
line
. */
if
(
end_line
==
NULL
)
break
;
/* If there is no end, we're done
with
this
regex
. */
if
(
end_line
==
NULL
)
break
;
/* Paint the rest of the line. */
mvwaddnstr
(
edit
,
line
,
margin
+
start_col
,
thetext
,
-
1
);
fileptr
->
multidata
[
varnish
->
id
]
=
CENDAFTER
;
/* Paint the rest of the line. */
mvwaddnstr
(
edit
,
line
,
margin
+
start_col
,
thetext
,
-
1
);
fileptr
->
multidata
[
varnish
->
id
]
=
CENDAFTER
;
#ifdef DEBUG
fprintf
(
stderr
,
" Marking for id %i line %i as CENDAFTER
\n
"
,
varnish
->
id
,
line
);
#endif
/* We've painted to the end of the line, so don't
* bother checking for any more starts. */
break
;
}
}
/* We've painted to the end of the line, so don't
* bother checking for any more starts. */
break
;
}
tail_of_loop:
wattroff
(
edit
,
varnish
->
attributes
);
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help