[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/2] files: look for digits and colons starting from the end of t
From: |
Benno Schulenberg |
Subject: |
[PATCH 1/2] files: look for digits and colons starting from the end of the filename |
Date: |
Sun, 26 May 2024 10:45:04 +0200 |
Starting from the end of the provided filename avoids needlessly looking
at colons that are somewhere in the middle of the path or the filename.
It also avoids inconsistenly interpreting a specified line number as a
column number when the filename itself ends with a colon plus digits
and the filename without the colon plus digits exists too.
This also removes the eliding of a backslash before a colon, which
would mangle the filename if the name actually contained a backslash
followed by a colon.
Negative line and column numbers are no longer allowed when using the
colon notation.
This fixes https://savannah.gnu.org/bugs/?65781,
and fixes https://savannah.gnu.org/bugs/?65782.
Problems existed since version 8.0, since colon parsing was introduced.
---
src/nano.c | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/src/nano.c b/src/nano.c
index 123af18d..5707bd96 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -2500,24 +2500,24 @@ int main(int argc, char **argv)
struct stat fileinfo;
/* If the filename contains a colon and this file does
not exist,
- * then check if the filename ends with a number (while
skipping
- * any colon preceded by a backslash and eliding the
backslash).
- * If there is a valid trailing number, chop colon and
number off.
+ * then check if the filename ends with digits preceded
by a colon
+ * (possibly preceded by more digits and a colon). If
there is or
+ * are such trailing numbers, chop the colons plus
numbers off.
* The number is later used to place the cursor on that
line. */
if (strchr(filename, ':') && stat(filename, &fileinfo)
< 0) {
- char *colon = filename + (*filename ? 1 : 0);
-
- while ((colon = strchr(colon, ':'))) {
- if (*(colon - 1) == '\\')
- memmove(colon - 1, colon,
strlen(colon) + 1);
- else if (parse_line_column(colon + 1,
&givenline, &givencol)) {
- *colon = '\0';
- if (stat(filename, &fileinfo) <
0) {
- *colon++ = ':';
- givencol = 0;
- }
- } else
- ++colon;
+ char *coda = filename + strlen(filename);
+ maybe_two:
+ while (--coda > filename + 1 && ('0' <= *coda
&& *coda <= '9'))
+ ;
+ if (*coda == ':' && ('0' <= *(coda + 1) &&
*(coda +1) <= '9')) {
+ *coda = '\0';
+ if (stat(filename, &fileinfo) < 0) {
+ *coda = ':';
+ /* If this was the first colon,
look for a second one. */
+ if (!strchr(coda + 1, ':'))
+ goto maybe_two;
+ } else if (!parse_line_column(coda + 1,
&givenline, &givencol))
+ die(_("Invalid number\n"));
}
}
--
2.42.1
- [PATCH 1/2] files: look for digits and colons starting from the end of the filename,
Benno Schulenberg <=