From 4c60dd73eca635a1f6cc7eabf2d43a9f4de63921 Mon Sep 17 00:00:00 2001
From: MTlls <matheustellestab8@gmail.com>
Date: Wed, 21 May 2025 11:23:48 -0300
Subject: [PATCH] add: gera grafos, entradas e testa

---
 src/formata_input.gvpr   |  15 +++++
 src/formatador.sh        |  34 +++++++++++
 src/testa_isomorfismo.sh |  52 +++++++++++++++++
 src/tira_style.gvpr      | 121 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 222 insertions(+)
 create mode 100644 src/formata_input.gvpr
 create mode 100755 src/formatador.sh
 create mode 100755 src/testa_isomorfismo.sh
 create mode 100755 src/tira_style.gvpr

diff --git a/src/formata_input.gvpr b/src/formata_input.gvpr
new file mode 100644
index 0000000..fa90f71
--- /dev/null
+++ b/src/formata_input.gvpr
@@ -0,0 +1,15 @@
+BEGIN {
+    int count = 0;
+    node_t n;
+}
+
+BEG_G {
+    print(nNodes($G));
+}
+
+E {
+    // Para cada aresta, imprime origem e destino
+    int origem = atoi($.tail.label)-1;
+    int destino = atoi($.head.label)-1;
+    printf("%s %s\n", origem, destino);
+}
diff --git a/src/formatador.sh b/src/formatador.sh
new file mode 100755
index 0000000..c8b748a
--- /dev/null
+++ b/src/formatador.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+# Verifica se um argumento foi fornecido
+if [ -z "$1" ]; then
+    echo "Uso: $0 <nome_arquivo>"
+    exit 1
+fi
+
+# Define variáveis com base no nome do arquivo
+BASENAME="$(basename "$1")"
+DIRNAME="$(dirname "$1")"
+INPUT="$1"
+OUTPUT="$DIRNAME/limpo_$BASENAME"
+OUTPUT_IN="$DIRNAME/$BASENAME.in"
+OUTPUT_IMG="$DIRNAME/limpo_$BASENAME.png"
+
+echo "Output: $OUTPUT"
+echo "Output in:$OUTPUT_IN"
+echo "Output img: $OUTPUT_IMG"
+echo "input: $INPUT"
+
+# # Executa o gvpr com o script de formatação
+# gvpr -f tira_style.gvpr "$INPUT" -o "$OUTPUT"
+
+# # Remove o prefixo dos blocos básicos
+# perl -pe 's/fn_0_basic_block_(\d+)/$1-1/ge' "$OUTPUT" > tmp && mv tmp "$OUTPUT"
+
+# # gera uma entrada valida para isomorfismo.cpp
+# gvpr -f formata_input.gvpr "$OUTPUT" > "$OUTPUT_IN"
+
+# # Gera a imagem PNG do grafo
+# dot -Tpng "$OUTPUT" -o "$OUTPUT_IMG"
+
+# echo "Processamento concluído: $OUTPUT e $OUTPUT_IMG gerados."
diff --git a/src/testa_isomorfismo.sh b/src/testa_isomorfismo.sh
new file mode 100755
index 0000000..64929f7
--- /dev/null
+++ b/src/testa_isomorfismo.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+# Verifica se os dois arquivos de código foram fornecidos
+if [ "$#" -ne 2 ]; then
+    echo "Uso: $0 <código1.c> <código2.c>"
+    exit 1
+fi
+
+# Diretório temporário
+TEMPDIR="./temp"
+mkdir -p "$TEMPDIR"
+
+# Recebe os arquivos de código como argumentos
+CODE1="$1"
+CODE2="$2"
+
+
+BASENAME1="$(basename "$CODE1")"
+BASENAME2="$(basename "$CODE2")"
+
+
+# Gera os arquivos .dot usando gcc no diretório temporário
+gcc -fdump-tree-cfg-graph "$CODE1" -o /dev/null
+gcc -fdump-tree-cfg-graph "$CODE2" -o /dev/null
+
+DOT1="a-${BASENAME1}.015t.cfg.dot"
+DOT2="a-${BASENAME2}.015t.cfg.dot"
+
+# Remove arquivos .cfg intermediários
+rm "a-${BASENAME1}.015t.cfg"
+rm "a-${BASENAME2}.015t.cfg"
+
+# Move os .dot para nomes mais simples
+mv "$DOT1" "$TEMPDIR/${BASENAME1}.dot"
+mv "$DOT2" "$TEMPDIR/${BASENAME2}.dot"
+
+DOT1="$TEMPDIR/${BASENAME1}.dot"
+DOT2="$TEMPDIR/${BASENAME2}.dot"
+
+gvpr -c -f src/tira_style.gvpr $DOT1 > $DOT1.tmp && mv $DOT1.tmp $DOT1
+gvpr -c -f src/tira_style.gvpr $DOT2 > $DOT2.tmp && mv $DOT2.tmp $DOT2
+
+dot -Tpng $DOT1 > $DOT1.png
+dot -Tpng $DOT2 > $DOT2.png
+
+gvpr -f src/formata_input.gvpr $DOT1 > input_isomorfismo/$BASENAME1
+gvpr -f src/formata_input.gvpr $DOT2 > input_isomorfismo/$BASENAME2
+
+src/isomorfismo < input_isomorfismo/$BASENAME1 > $DOT1.out
+src/isomorfismo < input_isomorfismo/$BASENAME2 > $DOT2.out
+
+diff -s $DOT1.out $DOT2.out
\ No newline at end of file
diff --git a/src/tira_style.gvpr b/src/tira_style.gvpr
new file mode 100755
index 0000000..e0f6481
--- /dev/null
+++ b/src/tira_style.gvpr
@@ -0,0 +1,121 @@
+BEGIN {
+	void print_attr_node(graph_t g, node_t n) {
+		string first = fstAttr(g, "N");
+		int i = 0;
+		while(strcmp(first, "") != 0) {
+			// printf("%s: %s\n", first, aget(n, first));
+			first = nxtAttr(g, "N", first);
+		}
+	}
+	void print_attr_graph(graph_t g) {
+		string first = fstAttr(g, "G");
+		int i = 0;
+		while(strcmp(first, "") != 0) {
+			// printf("%s: %s\n", first, aget(g, first));
+			first = nxtAttr(g, "G", first);
+		}
+	}
+	void delete_style_node(graph_t g, node_t n) {
+		string first = fstAttr(g, "N");
+		int i = 0;
+		while(strcmp(first, "") != 0) {
+			if(isAttr(g, "N", first)) {
+				aset(n, first, "");
+				// printf("Setado %s para %s\n", first, aget(n, first));
+			} else {
+				// printf("Não ta achando atributo\n");
+			}
+
+			first = nxtAttr(g, "N", first);
+		}
+	}
+
+    void print_attr_edge(graph_t g, edge_t e) {
+		string first = fstAttr(g, "E");
+		int i = 0;
+		while(strcmp(first, "") != 0) {
+			// printf("%s: %s\n", first, aget(e, first));
+			first = nxtAttr(g, "E", first);
+		}
+	}
+    graph_t delete_style_graph(graph_t g) {
+		string first = fstAttr(g, "G");
+		int i = 0;
+		while(strcmp(first, "") != 0) {
+			if(isAttr(g, "G", first)) {
+				aset(g, first, "");
+				// printf("Setado %s para %s\n", first, aget(g, first));
+			} else {
+				// printf("Não ta achando atributo\n");
+			}
+
+			first = nxtAttr(g, "G", first);
+        }
+        return g;
+	}
+}
+
+BEG_G {
+	graph_t g = cloneG($G, "");
+	int it = 0;
+    int i = 0;
+    delete_style_graph(fstsubg($G));
+}
+
+N {
+    if(hasAttr($, "label") && (strcmp(aget($, "label"), "ENTRY") == 0 || strcmp(aget($, "label"), "EXIT") == 0)){
+        // printf("deletando começo ou final: %s\n", aget($, "label"));
+        delete($G, $);
+		return;
+    }
+    
+	// printf("Nodo: %d\n", it++);
+	string firstN = fstAttr($G, "N");
+
+    while(strcmp(firstN, "") != 0) {
+		if(isAttr($G, "N", firstN)) {
+		    aset($, firstN, "");
+			// printf("Setado %s para %s\n", firstN, aget($, firstN));
+		} else {
+			// printf("Não achou atributo\n");
+		}
+
+		firstN = nxtAttr($G, "N", firstN);
+	}
+	
+    string id = $.name;
+    string clean = gsub(id, "fn_0_basic_block_", "");
+    aset($, "label", clean);
+
+	// print_attr_node($G, $);
+}
+
+E {
+    
+	// printf("Aresta: %d\n", it++);
+    if(hasAttr($, "style")){
+        if(strcmp(aget($, "style"), "invis") == 0 ){
+            // printf("deletando começo ou final: %s\n", aget($, "style"));
+            delete($T, $);
+        }
+    }
+    print_attr_edge($G, $);
+	// printf("label: %s\n", label);
+	// printf("ultimo caraactere: %c\n", (label + size));
+    print_attr_edge($G, $);
+	string firstE = fstAttr($G, "E");
+	i = 0;
+	while(strcmp(firstE, "") != 0) {
+		if(isAttr($G, "E", firstE)) {
+			aset($, firstE, "");
+			// printf("Setado %s para %s\n", firstE, aget($, firstE));
+		} else {
+			// printf("Não ta achando atributo\n");
+		}
+
+		firstE = nxtAttr($G, "E", firstE);
+	}
+}
+END_G {
+    $O = $G;
+}
-- 
GitLab