Code:
#include <string.h>
#include <stdio.h>
/* Dejan Lekic, <dejan%nu6.org>, 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() */
Oprosti na eventualnim greškama, kod je napisan za otprilike pola sata...
Stvar radi ovako:
Code:
dejan@gnu ~/prj/c
$ gmake x20x
cc x20x.c -o x20x
/tmp/ccA0RaEi.o(.text+0x16c): In function `main':
: the `gets' function is dangerous and should not be used.
dejan@gnu ~/prj/c
$ ./x20x
IME Dejan
x20x: Komanda=IME, Argument= Dejan
PREZ Lekic
x20x: Komanda=PREZIME, Argument= Lekic
BRISI Ovo
x20x: BRISEM
KRAJ
x20x: Komanda=KRAJ Prekidam program!
Ono, u pitanju je ultramegaprosti parser... ali je odgovor na ono što si pitao. Tu je i prilepljen sors fajl... ;)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin