/*
 * SiPi Electron — "sipi-electron <archivo.spe>"
 * Interprete en C, pensado para electronica, robots y electrodomesticos.
 */
#include "sipi_electron.h"
#include <stdio.h>
#include <stdlib.h>

static char *leer_archivo(const char *ruta) {
    FILE *f = fopen(ruta, "rb");
    if (!f) { fprintf(stderr, "No se pudo abrir el archivo: %s\n", ruta); exit(1); }
    fseek(f, 0, SEEK_END);
    long tam = ftell(f);
    fseek(f, 0, SEEK_SET);
    if (tam < 0) { fprintf(stderr, "No se pudo leer el archivo: %s\n", ruta); fclose(f); exit(1); }
    char *buf = malloc((size_t)tam + 1);
    if (!buf) { fprintf(stderr, "Sin memoria para leer el archivo: %s\n", ruta); fclose(f); exit(1); }
    size_t leidos = fread(buf, 1, (size_t)tam, f);
    buf[leidos] = '\0';
    fclose(f);
    return buf;
}

int main(int argc, char **argv) {
    /* Sin buffer: asi cualquier interfaz grafica que lea la salida por
     * una tuberia (pipe) ve cada linea al instante, en vez de esperar a
     * que el buffer de stdio se llene o el programa termine. */
    setvbuf(stdout, NULL, _IONBF, 0);

    if (argc < 2) {
        printf("SiPi Electron - motor para crear cosas electronicas con SiPi\n");
        printf("Uso: %s <archivo.spe>\n", argv[0]);
        return 1;
    }
    char *fuente = leer_archivo(argv[1]);
    Nodo *raiz = analizar_programa(fuente);
    if (raiz->texto[0]) printf("--- %s ---\n", raiz->texto);
    int r = interpretar_programa(raiz);
    free(fuente);
    return r;
}
