-
Notifications
You must be signed in to change notification settings - Fork 0
/
eBPF.cpp
57 lines (42 loc) · 1.32 KB
/
eBPF.cpp
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
#include <iterator>
#include <fstream>
#include "eBPF.h"
#include "Grafo.h"
#include "AnalizadorInstruccion.h"
#include "Repositorio.h"
#include "Resultado.h"
#define VACIO ""
eBPF::eBPF(RepositorioProtected& _nombres_archivos,
ResultadoProtected& _resultados) :
nombres_archivos(_nombres_archivos), resultados(_resultados) {}
static int analizar(const std::string& nombre_archivo) {
std::fstream archivo(nombre_archivo, std::fstream::in);
std::string linea;
std::vector<Instruccion> instrucciones;
std::vector<std::size_t> jmps;
Grafo grafo;
while (!archivo.eof()) {
std::getline(archivo, linea);
if (linea != VACIO) {
grafo.agregarNodo(linea);
AnalizadorInstruccion analizador;
Instruccion instruccion = analizador.identificar(linea);
instruccion.conectar(instrucciones, jmps, grafo);
instrucciones.push_back(instruccion);
}
}
for (std::size_t i = 0; i < jmps.size(); ++i) {
std::size_t pos_jmp = jmps[i];
instrucciones[pos_jmp].saltoA(instrucciones, pos_jmp, grafo);
}
return grafo.aplicarDFS();
}
void eBPF::operator()() {
std::string nombre_archivo_actual;
while ((nombre_archivo_actual = this->nombres_archivos.\
obtenerSiNoEstaVacio()) != VACIO) {
int resultado = analizar(nombre_archivo_actual);
this->resultados.agregar(nombre_archivo_actual, resultado);
}
}
eBPF::~eBPF() {}