diff --git a/.gitignore b/.gitignore index bbf313b..3c4b807 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,10 @@ # Debug files *.dSYM/ + +# Coisas IntelliJ +.idea/ + +# Coisas MacOS +./DS_Store +.DS_Store diff --git a/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/main.c b/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/main.c index d2eb504..03df86c 100644 --- a/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/main.c +++ b/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/main.c @@ -7,7 +7,7 @@ #include "montador.h" /* Versao do montador */ -#define VERSAO "1.1" +#define VERSAO "1.2" /* Arquivos de entrada e saida */ FILE *in; diff --git a/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/makefile b/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/makefile index 4e178a2..cb77b64 100644 --- a/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/makefile +++ b/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/makefile @@ -4,7 +4,7 @@ FILES = montador.c parser.c structs.c OBJS = $(FILES:.c=.o) NAME_FLAG = -o LINK_FLAG = -g -COMP_FLAG = -march=native -03 -g +COMP_FLAGS = -march=native -O3 -g NAME = montador all: main.o $(OBJS) diff --git a/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/parser.c b/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/parser.c index 14db3a1..8883160 100644 --- a/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/parser.c +++ b/NovoMontadorLinux/Montador_Ultimo_Beta_64Kb/parser.c @@ -76,7 +76,47 @@ void CarregaPrograma(char *nome) in = fopen(nome,"r"); if (in == NULL) parser_Abort("Nao foi possivel carregar o arquivo de programa."); - line_count=parser_CountLines(); + // Vai para o fim do arquivo + if (fseek(in, 0, SEEK_END) != 0) { + parser_Abort("Erro ao buscar o fim do arquivo.\n"); + } + + long size = ftell(in); + if (size == 0) { + parser_Abort("Arquivo vazio.\n"); + } + + // Volta para o último byte + if (fseek(in, -1, SEEK_END) != 0) { + parser_Abort("Erro ao buscar o último byte do arquivo.\n"); + } + + int last_char = fgetc(in); // Lê o último caractere + + if (last_char != '\n') { + fclose(in); + + // Abre para leitura e escrita + in = fopen(nome, "a"); // modo append: evita sobrescrever + if (in == NULL) { + parser_Abort("Não foi possível abrir o arquivo em modo append.\n"); + } + + if (fputc('\n', in) == EOF) { + parser_Abort("Erro ao escrever nova linha no fim do arquivo.\n"); + } + + fclose(in); + } + + // Reabre para leitura normal + in = fopen(nome, "r"); + if (in == NULL) { + parser_Abort("Não foi possível reabrir o arquivo em modo leitura.\n"); + } + + line_count = parser_CountLines(); + progr_buffer = (char**) malloc(line_count*sizeof(char*)); fseek(in,0L,SEEK_SET); parser_LoadProgram();