summaryrefslogtreecommitdiff
path: root/src/util.cc
blob: 9bf83cc5d6189711727cbb6a378ec68cd6e6b728 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// -*- c++ -*-
// Distributed under the BSD 2-Clause License.
// See accompanying file LICENSE for details.
#include "util.h"

#include <iostream>
#include <fstream>

std::string readFile(const std::string& fileName)
{
	std::ifstream ifs(fileName.c_str(),
	                  std::ios::in | std::ios::binary | std::ios::ate);

	std::ifstream::pos_type fileSize = ifs.tellg();
	ifs.seekg(0, std::ios::beg);

	std::vector<char> bytes(fileSize);
	ifs.read(bytes.data(), fileSize);

	return std::string(bytes.data(), fileSize);
}

std::vector<std::string> readDeps(const std::string& depFile)
{
	if(!std::filesystem::exists(depFile))
	{
		return {};
	}

	auto str = readFile(depFile);

	std::vector<std::string> output;
	std::string tmp;
	bool start{false};
	bool in_whitespace{false};
	for(const auto& c : str)
	{
		if(c == '\\' || c == '\n')
		{
			continue;
		}

		if(c == ':')
		{
			start = true;
			continue;
		}

		if(!start)
		{
			continue;
		}

		if(c == ' ' || c == '\t')
		{
			if(in_whitespace)
			{
				continue;
			}

			if(!tmp.empty())
			{
				output.push_back(tmp);
			}
			tmp.clear();
			in_whitespace = true;
		}
		else
		{
			in_whitespace = false;
			tmp += c;
		}
	}

	if(!tmp.empty())
	{
		output.push_back(tmp);
	}

	return output;
}

Language languageFromExtension(const std::filesystem::path& file)
{
	auto ext = file.extension().string();
	if(ext == ".c")
	{
		return Language::C;
	}

	if(ext == ".C" ||
	   ext == ".cc" ||
	   ext == ".cpp" ||
	   ext == ".CPP" ||
	   ext == ".c++" ||
	   ext == ".cp" ||
	   ext == ".cxx")
	{
		return Language::Cpp;
	}

	if(ext == ".s" ||
	   ext == ".S" ||
	   ext == ".asm")
	{
		return Language::Asm;
	}

	std::cerr << "Could not deduce language from " << file.string() << "\n";
	exit(1);
	return {};
}