Сибгхатук,
Я собираюсь предположить, что ваша домашняя работа была сдана, поэтому "безопасно" просто передать вам "ответ".
Я бы сделал это примерно так:
package forums;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
public class HashInclude
{
private static final String[] INCLUDE_PATH =
System.getenv("INCLUDE_PATH").split(File.pathSeparator);
public static void main(String... args) {
try {
for ( String filename : filenames ) {
hashInclude(filename);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void hashInclude(String filename)
throws FileNotFoundException, IOException
{
BufferedReader reader = new BufferedReader(new FileReader(filename));
try {
String line = null;
int lineCount = 0;
while ( (line=reader.readLine()) != null ) {
++lineCount;
if ( line.startsWith("#include ") ) {
String targetFilename = line.replaceFirst("^#include[ \t]*", "").trim();
if ( !targetFilename.matches("^[<\"][A-z0-9_]+\\.h[\">]$") )
// not a <valid.h> or a "valid.h"
throw new IncludeException(targetFilename, lineCount, filename);
// <valid.h> --> valid.h
targetFilename = targetFilename.substring(1, targetFilename.length()-1);
// search directories in the INCLUDE_PATH for targetFilename
for ( String dir : INCLUDE_PATH ) {
File targetFile = new File(dir, targetFilename); // c:/path/to/valid.h
if ( targetFile.exists() ) {
hashInclude( targetFile.getAbsolutePath() ); // <<-- recursive call
return;
}
} // next dir
throw new FileNotFoundException("File " + targetFilename
+ " not found in INCLUDE_PATH="+ System.getenv("INCLUDE_PATH"));
} else {
System.out.println(line);
}
} // next line
} finally {
reader.close();
}
}
}
class IncludeException extends RuntimeException {
private static final long serialVersionUID = 0L;
public IncludeException(String targetFilename, int lineCount, String filename) {
super("Invalid #include: " + targetFilename + " at " + lineCount + " " + filename);
}
}
Я думаю, что вышеупомянутое является "достаточно элегантным" решением проблемы ... даже если я сам так говорю; -)
Обратите внимание, что метод hashInclude
рекурсивно вызывает себя ... рекурсия поддается естественному следованию "произвольной древовидной структуре" ... то есть дереву, чья точная структура непостижима при написании программного обеспечения ... поэтому «рекурсия» - это первое, что приходит в голову многим программистам, когда они здесь произносят слово «дерево».
Обратите внимание, что в приведенном выше коде реализована значительно упрощенная версия механизма препроцессора C #include ... но его можно (довольно легко) расширить в "правильный препроцессор" ... который даже (рекурсивно) расширяет # определяет.
Приветствия. Кит.