#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define PATH "/home/rombus/Escritorio/sample.c"
#define TERMINADO "/home/rombus/Escritorio/prueba.c"
#define FALSE 0
#define TRUE !FALSE
#define INCLUDE 1
#define DEFINE 2
#define UNKNOWN -1
#define STD 3
#define LOCAL 4
#define hastaEOL(a) while((fgetc(a)!= 'n') && (fgetc(a) != EOF))
#define unoParaAtraz(a) fseek(a,(long)-1,SEEK_CUR)
#define dosParaAtraz(a) fseek(a,(long)-2,SEEK_CUR)
#define unoParaAdelante(a) fseek(a,(long)1,SEEK_CUR)
#define dosParaAdelnate(a) fseek(a,(long)2,SEEK_CUR)
typedef char boolean;
typedef char macroType;
///-Prototypes-///
char *getLine(FILE *a);
macroType define_o_include(FILE *a);
macroType std_o_local(FILE *a);
boolean esMacro(FILE *a);
void comeBlancos(FILE *a);
boolean saltoMacros(FILE *a);
void pasaIncludesStd(FILE *a, FILE *b, boolean *flagLocal){
long pos, inicio = ftell(a),len;
char c; //Variable de control
char *cadena = (char *)malloc(sizeof(char)*255);
macroType control;
while(esMacro(a)){
pos = (ftell(a));
control = define_o_include(a);
if(control == INCLUDE){
c = std_o_local(a);
if(c == STD){
hastaEOL(a); //Me paro al final de la linea
len = ftell(a)-pos; //Me da la cantidad de bytes q se corrio del principio
fseek(a,(long)pos,SEEK_SET);
cadena = getLine(a);
fwrite(cadena,sizeof(char),len,b); //Tener cuidado con esto, posible nido de bugs
printf("escribio: %s - n",cadena);
}
else if(c == LOCAL)
(*flagLocal) = TRUE;
}
else if(control == DEFINE) //Si es un define salto toda la linea
hastaEOL(a);
}
fseek(a,inicio*-1,SEEK_CUR); //Voy a donde estaba cuando me lo pasaron
}
int main(void){
FILE *a = fopen(PATH,"rb");
FILE *b = fopen(TERMINADO,"wt");
boolean flagLocal = FALSE;
pasaIncludesStd(a,b,&flagLocal); //pasar los includes <>
fclose(a);
fclose(b);
return 0;
}
///-FUNCIONES-///
char *getLine(FILE *a){
char *l = (char*)malloc(255*sizeof(char));
int i = 0;
do{
l[i] = fgetc(a);
}while((l[i] != 'n') && (l[i++] != EOF));
return l;
}
macroType define_o_include(FILE *a){
char c =fgetc(a);
if(c == '#') //Por si cuando invocan la funcion no saben si es macro
c = fgetc(a);
if(c == 'i')
return INCLUDE;
if(c == 'd')
return DEFINE;
return UNKNOWN;
}
macroType std_o_local(FILE *a){
#define LEN_INCLUDE 8 //Largo de la palabra "#include "
int i=0;
char c = fgetc(a);
if(c == '#') //Si llamo a la funcion sin antes haber leido el '#'
unoParaAtraz(a);
else //Si llamo a la funcion antes habiendo leido el '#'
dosParaAtraz(a);
while(i++<LEN_INCLUDE) //Salto el "#include "
fgetc(a);
c = fgetc(a); //Leo el "" o el <>
printf("el caracter es: %cn",c);
if(c == '"')
return LOCAL;
else if(c == '<')
return STD;
return UNKNOWN;
}
boolean esMacro(FILE *a){
char c;
comeBlancos(a);
c = fgetc(a);
unoParaAtraz(a);
if(c == '#')
return TRUE;
return FALSE;
}
void comeBlancos(FILE *a){
char b;
while( (b = fgetc(a)) == ' ' || b == 'n' || b == 't');
printf("salio del comeBlancos con un %cn",b);
unoParaAtraz(a);
}
boolean saltoMacros(FILE *a){
char c;
boolean flag = FALSE;
do{
if(flag) //Leo toda la linea una vez que leyo el primer caracter
hastaEOL(a);
else
flag = TRUE; //Cuando es la primera vez habilito la bandera
comeBlancos(a);
c = fgetc(a);
}while(c =='#');
unoParaAtraz(a);
return FALSE; //Terminaron los macros
}