Skip to content

Commit e55874f

Browse files
author
Federico Fissore
committed
Merge branch 'ide-1.5.x' into ide-1.5.x-jssc
2 parents 0bc781e + 139dd6b commit e55874f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1725
-59
lines changed

app/src/processing/app/preproc/PdePreprocessor.java

Lines changed: 62 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -242,25 +242,24 @@ public int firstStatement(String in) {
242242
*/
243243
public String strip(String in) {
244244
// XXX: doesn't properly handle special single-quoted characters
245-
List<Pattern> patterns = new ArrayList<Pattern>();
246245
// single-quoted character
247-
patterns.add(Pattern.compile("('.')", Pattern.MULTILINE));
248-
// single and multi-line comment
249-
patterns.add(Pattern.compile("('\\\\\"')", Pattern.MULTILINE));
250-
patterns.add(Pattern.compile("(//.*?$)", Pattern.MULTILINE));
251-
patterns.add(Pattern.compile("(/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)", Pattern.MULTILINE));
252-
// pre-processor directive
253-
patterns.add(Pattern.compile("(^\\s*#.*?$)", Pattern.MULTILINE));
246+
String p = "('.')";
247+
248+
p += "|('\\\\\"')";
249+
254250
// double-quoted string
255-
patterns.add(Pattern.compile("(\"(?:[^\"\\\\]|\\\\.)*\")", Pattern.MULTILINE));
251+
p += "|(\"(?:[^\"\\\\]|\\\\.)*\")";
256252

257-
String code = in;
258-
for (Pattern p : patterns) {
259-
Matcher matcher = p.matcher(code);
260-
code = matcher.replaceAll(" ");
261-
}
253+
// single and multi-line comment
254+
//p += "|" + "(//\\s*?$)|(/\\*\\s*?\\*/)";
255+
p += "|(//.*?$)|(/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)";
256+
257+
// pre-processor directive
258+
p += "|" + "(^\\s*#.*?$)";
262259

263-
return code;
260+
Pattern pattern = Pattern.compile(p, Pattern.MULTILINE);
261+
Matcher matcher = pattern.matcher(in);
262+
return matcher.replaceAll(" ");
264263
}
265264

266265
/**
@@ -333,17 +332,54 @@ public ArrayList<String> prototypes(String in) {
333332
* Replace all commented portions of a given String as spaces.
334333
* Utility function used here and in the preprocessor.
335334
*/
336-
static public String scrubComments(String what) {
337-
List<Pattern> patterns = new ArrayList<Pattern>();
338-
patterns.add(Pattern.compile("('\\\\\"')", Pattern.MULTILINE));
339-
patterns.add(Pattern.compile("(//.*?$)", Pattern.MULTILINE));
340-
patterns.add(Pattern.compile("(/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)", Pattern.MULTILINE));
341-
342-
String result = what;
343-
for (Pattern p : patterns) {
344-
result = p.matcher(result).replaceAll("");
345-
}
335+
public String scrubComments(String what) {
336+
char p[] = what.toCharArray();
337+
338+
int index = 0;
339+
boolean insideString = false;
340+
while (index < p.length) {
341+
if (p[index] == '\"') {
342+
insideString = !insideString;
343+
}
344+
// for any double slash comments, ignore until the end of the line
345+
if (!insideString && (p[index] == '/') &&
346+
(index < p.length - 1) &&
347+
(p[index+1] == '/')) {
348+
p[index++] = ' ';
349+
p[index++] = ' ';
350+
while ((index < p.length) &&
351+
(p[index] != '\n')) {
352+
p[index++] = ' ';
353+
}
346354

347-
return result;
355+
// check to see if this is the start of a new multiline comment.
356+
// if it is, then make sure it's actually terminated somewhere.
357+
} else if (!insideString && (p[index] == '/') &&
358+
(index < p.length - 1) &&
359+
(p[index+1] == '*')) {
360+
p[index++] = ' ';
361+
p[index++] = ' ';
362+
boolean endOfRainbow = false;
363+
while (index < p.length - 1) {
364+
if ((p[index] == '*') && (p[index+1] == '/')) {
365+
p[index++] = ' ';
366+
p[index++] = ' ';
367+
endOfRainbow = true;
368+
break;
369+
370+
} else {
371+
// continue blanking this area
372+
p[index++] = ' ';
373+
}
374+
}
375+
if (!endOfRainbow) {
376+
throw new RuntimeException(_("Missing the */ from the end of a " +
377+
"/* comment */"));
378+
}
379+
} else { // any old character, move along
380+
index++;
381+
}
382+
}
383+
return new String(p);
348384
}
349385
}

0 commit comments

Comments
 (0)