summaryrefslogtreecommitdiff
path: root/tools/scaninc/scaninc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/scaninc/scaninc.cpp')
-rw-r--r--tools/scaninc/scaninc.cpp88
1 files changed, 22 insertions, 66 deletions
diff --git a/tools/scaninc/scaninc.cpp b/tools/scaninc/scaninc.cpp
index 3dc2214..b95cbd0 100644
--- a/tools/scaninc/scaninc.cpp
+++ b/tools/scaninc/scaninc.cpp
@@ -25,8 +25,7 @@
#include <set>
#include <string>
#include "scaninc.h"
-#include "asm_file.h"
-#include "c_file.h"
+#include "source_file.h"
bool CanOpenFile(std::string path)
{
@@ -46,7 +45,7 @@ int main(int argc, char **argv)
std::queue<std::string> filesToProcess;
std::set<std::string> dependencies;
- std::list<std::string> includeDirs;
+ std::vector<std::string> includeDirs;
argc--;
argv++;
@@ -63,7 +62,7 @@ int main(int argc, char **argv)
argv++;
includeDir = std::string(argv[0]);
}
- if (includeDir.back() != '/')
+ if (!includeDir.empty() && includeDir.back() != '/')
{
includeDir += '/';
}
@@ -83,79 +82,36 @@ int main(int argc, char **argv)
std::string initialPath(argv[0]);
- std::size_t pos = initialPath.find_last_of('.');
+ filesToProcess.push(initialPath);
- if (pos == std::string::npos)
- FATAL_ERROR("no file extension in path \"%s\"\n", initialPath.c_str());
-
- std::string extension = initialPath.substr(pos + 1);
-
- std::string srcDir("");
- std::size_t slash = initialPath.rfind('/');
- if (slash != std::string::npos)
- {
- srcDir = initialPath.substr(0, slash + 1);
- }
- includeDirs.push_back(srcDir);
-
- if (extension == "c" || extension == "h")
+ while (!filesToProcess.empty())
{
- filesToProcess.push(initialPath);
+ std::string filePath = filesToProcess.front();
+ SourceFile file(filePath);
+ filesToProcess.pop();
- while (!filesToProcess.empty())
+ includeDirs.push_back(file.GetSrcDir());
+ for (auto incbin : file.GetIncbins())
{
- CFile file(filesToProcess.front());
- filesToProcess.pop();
-
- file.FindIncbins();
- for (auto incbin : file.GetIncbins())
- {
- dependencies.insert(incbin);
- }
- for (auto include : file.GetIncludes())
+ dependencies.insert(incbin);
+ }
+ for (auto include : file.GetIncludes())
+ {
+ for (auto includeDir : includeDirs)
{
- for (auto includeDir : includeDirs)
+ std::string path(includeDir + include);
+ if (CanOpenFile(path))
{
- std::string path(includeDir + include);
- if (CanOpenFile(path))
+ bool inserted = dependencies.insert(path).second;
+ if (inserted)
{
- bool inserted = dependencies.insert(path).second;
- if (inserted)
- {
- filesToProcess.push(path);
- }
- break;
+ filesToProcess.push(path);
}
+ break;
}
}
}
- }
- else if (extension == "s" || extension == "inc")
- {
- filesToProcess.push(initialPath);
-
- while (!filesToProcess.empty())
- {
- AsmFile file(filesToProcess.front());
-
- filesToProcess.pop();
-
- IncDirectiveType incDirectiveType;
- std::string path;
-
- while ((incDirectiveType = file.ReadUntilIncDirective(path)) != IncDirectiveType::None)
- {
- bool inserted = dependencies.insert(path).second;
- if (inserted
- && incDirectiveType == IncDirectiveType::Include
- && CanOpenFile(path))
- filesToProcess.push(path);
- }
- }
- }
- else
- {
- FATAL_ERROR("unknown extension \"%s\"\n", extension.c_str());
+ includeDirs.pop_back();
}
for (const std::string &path : dependencies)