aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/anarres
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/org/anarres')
-rw-r--r--src/java/org/anarres/cpp/FileLexerSource.java21
-rw-r--r--src/java/org/anarres/cpp/Preprocessor.java40
-rw-r--r--src/java/org/anarres/cpp/Source.java8
3 files changed, 39 insertions, 30 deletions
diff --git a/src/java/org/anarres/cpp/FileLexerSource.java b/src/java/org/anarres/cpp/FileLexerSource.java
index 3cf8604..4edf4fb 100644
--- a/src/java/org/anarres/cpp/FileLexerSource.java
+++ b/src/java/org/anarres/cpp/FileLexerSource.java
@@ -37,14 +37,15 @@ import static org.anarres.cpp.Token.*;
* @see Source
*/
public class FileLexerSource extends LexerSource {
- private File file;
+ // private File file;
+ private String path;
/**
* Creates a new Source for lexing the given File.
*
* Preprocessor directives are honoured within the file.
*/
- public FileLexerSource(File file)
+ public FileLexerSource(File file, String path)
throws IOException {
super(
new BufferedReader(
@@ -55,7 +56,13 @@ public class FileLexerSource extends LexerSource {
true
);
- this.file = file;
+ // this.file = file;
+ this.path = path;
+ }
+
+ public FileLexerSource(File file)
+ throws IOException {
+ this(file, file.getPath());
}
public FileLexerSource(String path)
@@ -64,16 +71,16 @@ public class FileLexerSource extends LexerSource {
}
@Override
- /* pp */ File getFile() {
- return file;
+ /* pp */ String getPath() {
+ return path;
}
@Override
/* pp */ String getName() {
- return String.valueOf(file);
+ return getPath();
}
public String toString() {
- return "file " + file;
+ return "file " + path;
}
}
diff --git a/src/java/org/anarres/cpp/Preprocessor.java b/src/java/org/anarres/cpp/Preprocessor.java
index c6e98cb..0547399 100644
--- a/src/java/org/anarres/cpp/Preprocessor.java
+++ b/src/java/org/anarres/cpp/Preprocessor.java
@@ -939,38 +939,38 @@ public class Preprocessor {
}
/**
- * Includes the given file.
+ * Attempts to include the given file.
*
* User code may override this method to implement a virtual
* file system.
- *
- * XXX This API subject to change, using File makes no sense
- * here.
*/
- protected boolean include(File file)
+ protected boolean include(String path)
throws IOException,
LexerException {
+ File file = new File(path);
// System.out.println("Try to include " + file);
- if (!file.exists())
- return false;
if (!file.isFile())
return false;
push_source(new FileLexerSource(file), true);
return true;
}
+ protected String include_dirname(String path) {
+ return (new File(path)).getParentFile().getPath();
+ }
+
+ protected String include_filename(String dir, String name) {
+ return dir + File.separator + name;
+ }
+
/**
* Includes a file from an include path, by name.
- *
- * XXX This API subject to change, using File makes no sense
- * here.
*/
- protected boolean include(Iterable<String> path, String name)
+ private boolean include(Iterable<String> path, String name)
throws IOException,
LexerException {
for (String dir : path) {
- File file = new File(dir + File.separator + name);
- if (include(file))
+ if (include(include_filename(dir, name)))
return true;
}
return false;
@@ -983,16 +983,18 @@ public class Preprocessor {
* for the include directive, for example, creating a Source
* based on a virtual file system.
*/
- protected void include(File parent, int line,
+ protected void include(String parent, int line,
String name, boolean quoted)
throws IOException,
LexerException {
if (quoted) {
- File dir = parent.getAbsoluteFile().getParentFile();
+ String dir = include_dirname(parent);
+ String path;
if (dir == null)
- dir = new File("/"); // XXX bleh.
- File file = new File(dir, name);
- if (include(file))
+ path = name;
+ else
+ path = include_filename(dir, name);
+ if (include(path))
return;
if (include(quoteincludepath, name))
return;
@@ -1064,7 +1066,7 @@ public class Preprocessor {
}
/* Do the inclusion. */
- include(source.getFile(), tok.getLine(), name, quoted);
+ include(source.getPath(), tok.getLine(), name, quoted);
/* 'tok' is the 'nl' after the include. We use it after the
* #line directive. */
diff --git a/src/java/org/anarres/cpp/Source.java b/src/java/org/anarres/cpp/Source.java
index f89b1f8..0f9efa4 100644
--- a/src/java/org/anarres/cpp/Source.java
+++ b/src/java/org/anarres/cpp/Source.java
@@ -133,12 +133,12 @@ public abstract class Source implements Iterable<Token> {
* it will ask the parent Source, and so forth recursively.
* If no Source on the stack is a FileLexerSource, returns null.
*/
- /* pp */ File getFile() {
+ /* pp */ String getPath() {
Source parent = getParent();
while (parent != null) {
- File file = parent.getFile();
- if (file != null)
- return file;
+ String path = parent.getPath();
+ if (path != null)
+ return path;
parent = parent.getParent();
}
return null;