aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornyamatongwe <devnull@localhost>2003-11-30 11:58:58 +0000
committernyamatongwe <devnull@localhost>2003-11-30 11:58:58 +0000
commitc6a7237faad71cb17daa94b6431fc7a33bcee75e (patch)
tree8ab3be50a035d620e2c58a83ff4e0db631b2e9cb /src
parent14ca8f513e565aeb8112403897db03f115253cdb (diff)
downloadscintilla-mirror-c6a7237faad71cb17daa94b6431fc7a33bcee75e.tar.gz
Handle backslashed characters in replacement for regex.
Diffstat (limited to 'src')
-rw-r--r--src/Document.cxx66
1 files changed, 55 insertions, 11 deletions
diff --git a/src/Document.cxx b/src/Document.cxx
index 0320fcb7f..fb28144dd 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -1066,10 +1066,24 @@ const char *Document::SubstituteByPosition(const char *text, int *length) {
return 0;
unsigned int lenResult = 0;
for (int i = 0; i < *length; i++) {
- if ((text[i] == '\\') && (text[i + 1] >= '1' && text[i + 1] <= '9')) {
- unsigned int patNum = text[i + 1] - '0';
- lenResult += pre->eopat[patNum] - pre->bopat[patNum];
- i++;
+ if (text[i] == '\\') {
+ if (text[i + 1] >= '1' && text[i + 1] <= '9') {
+ unsigned int patNum = text[i + 1] - '0';
+ lenResult += pre->eopat[patNum] - pre->bopat[patNum];
+ i++;
+ } else {
+ switch (text[i + 1]) {
+ case 'a':
+ case 'b':
+ case 'f':
+ case 'n':
+ case 'r':
+ case 't':
+ case 'v':
+ i++;
+ }
+ lenResult++;
+ }
} else {
lenResult++;
}
@@ -1079,13 +1093,43 @@ const char *Document::SubstituteByPosition(const char *text, int *length) {
return 0;
char *o = substituted;
for (int j = 0; j < *length; j++) {
- if ((text[j] == '\\') && (text[j + 1] >= '1' && text[j + 1] <= '9')) {
- unsigned int patNum = text[j + 1] - '0';
- unsigned int len = pre->eopat[patNum] - pre->bopat[patNum];
- if (pre->pat[patNum]) // Will be null if try for a match that did not occur
- memcpy(o, pre->pat[patNum], len);
- o += len;
- j++;
+ if (text[j] == '\\') {
+ if (text[j + 1] >= '1' && text[j + 1] <= '9') {
+ unsigned int patNum = text[j + 1] - '0';
+ unsigned int len = pre->eopat[patNum] - pre->bopat[patNum];
+ if (pre->pat[patNum]) // Will be null if try for a match that did not occur
+ memcpy(o, pre->pat[patNum], len);
+ o += len;
+ j++;
+ } else {
+ j++;
+ switch (text[j]) {
+ case 'a':
+ *o++ = '\a';
+ break;
+ case 'b':
+ *o++ = '\b';
+ break;
+ case 'f':
+ *o++ = '\f';
+ break;
+ case 'n':
+ *o++ = '\n';
+ break;
+ case 'r':
+ *o++ = '\r';
+ break;
+ case 't':
+ *o++ = '\t';
+ break;
+ case 'v':
+ *o++ = '\v';
+ break;
+ default:
+ *o++ = '\\';
+ j--;
+ }
+ }
} else {
*o++ = text[j];
}