#include #include /* Dejan Lekic, , http://dejan.nu6.org */ enum x20x { T_BRISI = 0, /* CLS token */ T_IME, /* token za komandu IME */ T_PREZIME, /* token komande PREZIME */ T_KRAJ /* token za KRAJ */ }; /* enum x20x */ #define MAX_LEN 4096 /* valjda nece niko kucati duzu liniju? */ #define NUM_COM 4 /* broj komandi koje obradjujemo */ char* saKomande[4] = { "BRISI", /* odgovarajuca T_ vrednost: T_BRISI */ "IME", /* T_IME */ "PREZ", /* T_PREZIME, ne smemo "PREZIME" ! :) */ "KRAJ" /* T_KRAJ */ }; /** * Napomena, pisati ovakav "glupi" parser je idiotarija * narod mnogo pametniji od autora je napisao pomocne * alatke koji GENERISU PARSERE, jedna od njih je FLEX. */ char procesljaj(const char* sArg, char* sResto) { char* pToken = NULL; int iSta = T_BRISI; /* inicijalno je BRISI */ char* pKomanda; char cRezultat = T_KRAJ; int ii = 0; char sKopija[MAX_LEN]; strcpy(sKopija, sArg); /* hajde da nadjemo o kojoj komandi je rec */ for (ii = 0; ii < NUM_COM; ii++) { pKomanda = strstr(sKopija, saKomande[ii]); if (pKomanda != NULL) { /** * Hajde da "pokupimo" argument komande... * ovo je poznata specificnost funkcije strtok() :) */ pToken = strtok(sKopija, saKomande[ii]); if (pToken) { strcpy(sResto, pToken); } /* if */ pToken = strtok(NULL, saKomande[ii]); if (pToken) { strcpy(sResto, pToken); printf("DEBUG: %s\n", pToken); } return ii; /* Mozemo komotno da izadjemo odmah */ } /* if */ strcpy(sKopija, sArg); /* vracamo stari string */ } /* for */ return cRezultat; } /* char procesljaj() */ int main(char argc, char** argv) { char sLinija[MAX_LEN]; char* pToken = NULL; char bKraj = 1; char sArgument[MAX_LEN]; /** * valjalo bi ovo optimizovati ... * recimo da se koristi makar dinamicka alokacija */ for (; bKraj;) { gets(sLinija); switch (procesljaj(sLinija, sArgument)) { case T_BRISI: { printf("x20x: BRISEM\n"); break; } /* case */ case T_IME: { printf("x20x: Komanda=IME, Argument=%s\n", sArgument); break; } case T_PREZIME: { printf("x20x: Komanda=PREZIME, Argument=%s\n", sArgument); break; } case T_KRAJ: { printf("x20x: Komanda=KRAJ Prekidam program!\n"); bKraj = 0; break; } default: printf("x20x: Greska! Linija=\"%s\"", sLinija); } /* switch */ sLinija[0]='\0'; } /* for */ return 0; } /* main() */