in HSQL/src/org/hsqldb1/util/CodeSwitcher.java [321:491]
boolean processFile(String name) {
File f = new File(name);
File fnew = new File(name + ".new");
int state = 0; // 0=normal 1=inside_if 2=inside_else
boolean switchoff = false;
boolean working = false;
try {
Vector v = getFileLines(f);
Vector v1 = new Vector(v.size());
for (int i = 0; i < v.size(); i++) {
v1.addElement(v.elementAt(i));
}
for (int i = 0; i < v.size(); i++) {
String line = (String) v.elementAt(i);
if (line == null) {
break;
}
if (working) {
if (line.equals("/*") || line.equals("*/")) {
v.removeElementAt(i--);
continue;
}
}
if (line.startsWith("//#")) {
if (line.startsWith("//#ifdef ")) {
if (state != 0) {
printError("'#ifdef' not allowed inside '#ifdef'");
return false;
}
state = 1;
String s = line.substring(9);
if (vSwitchOn.indexOf(s) != -1) {
working = true;
switchoff = false;
} else if (vSwitchOff.indexOf(s) != -1) {
working = true;
v.insertElementAt("/*", ++i);
switchoff = true;
}
if (vSwitches.indexOf(s) == -1) {
vSwitches.addElement(s);
}
} else if (line.startsWith("//#ifndef ")) {
if (state != 0) {
printError(
"'#ifndef' not allowed inside '#ifdef'");
return false;
}
state = 1;
String s = line.substring(10);
if (vSwitchOff.indexOf(s) != -1) {
working = true;
switchoff = false;
} else if (vSwitchOn.indexOf(s) != -1) {
working = true;
v.insertElementAt("/*", ++i);
switchoff = true;
}
if (vSwitches.indexOf(s) == -1) {
vSwitches.addElement(s);
}
} else if (line.startsWith("//#else")) {
if (state != 1) {
printError("'#else' without '#ifdef'");
return false;
}
state = 2;
if (!working) {}
else if (switchoff) {
if (v.elementAt(i - 1).equals("")) {
v.insertElementAt("*/", i - 1);
i++;
} else {
v.insertElementAt("*/", i++);
}
switchoff = false;
} else {
v.insertElementAt("/*", ++i);
switchoff = true;
}
} else if (line.startsWith("//#endif")) {
if (state == 0) {
printError("'#endif' without '#ifdef'");
return false;
}
state = 0;
if (working && switchoff) {
if (v.elementAt(i - 1).equals("")) {
v.insertElementAt("*/", i - 1);
i++;
} else {
v.insertElementAt("*/", i++);
}
}
working = false;
} else {}
}
}
if (state != 0) {
printError("'#endif' missing");
return false;
}
boolean filechanged = false;
for (int i = 0; i < v.size(); i++) {
if (!v1.elementAt(i).equals(v.elementAt(i))) {
filechanged = true;
break;
}
}
if (!filechanged) {
return true;
}
writeFileLines(v, fnew);
File fbak = new File(name + ".bak");
fbak.delete();
f.renameTo(fbak);
File fcopy = new File(name);
fnew.renameTo(fcopy);
fbak.delete();
return true;
} catch (Exception e) {
printError(e.toString());
return false;
}
}