Witam,
Czy ten kod programu jest poprawny? Jakie błędy mogą w nim wystąpić? Uczę się teraz tego trudnego języka, ale chciałbym wiedzieć co w nim poprawić.
/** Statycznie zdefiniowany uzytkownik */
UZYTKOWNIK "GRAF2"
%{
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/**
* Definicja struktury, zbudowanej na wskaznikach kolejki jednokierunkowej, uzywanej
* do omijania dublujacych sie wynikow
* Dodatkowo deklaracja dwoch wskaznikow - poczatku i konca (dla przyspieszenia operacji)
*/
struct lista {
char *nazwa;
struct lista *next;
} *start = 0, *stop = 0;
/**
* Funkcja dodaj dodaje nowy element na koniec kolejki
*/
void dodaj(char *str) {
struct lista *tmp;
char *strtmp;
tmp = (struct lista*)malloc(sizeof(struct lista));
strtmp = (char*)malloc(sizeof(char)*(strlen(str)+1));
strcpy(strtmp, str);
if(!start)
stop = start = tmp;
stop->next = tmp;
tmp->nazwa = strtmp;
tmp->next = 0;
stop = tmp;
}
/**
* Funkcja wyszukaj zwraca 1, jezeli znajdzie ciag znakow str w kolejce
* Zwraca 0 jezeli nie znajdzie (rowniez jezeli kolejka jest pusta)
*/
int wyszukaj(char *str) {
int zwrot = 1;
struct lista *tmp = start;
if(start) {
while(tmp && zwrot) {
zwrot = strcmp(tmp->nazwa, str);
tmp = tmp->next;
}
}
return !zwrot;
}
/**
* Funkcja mpo jest wywolywana pod koniec programu, usuwa wszystkie
* dynamicznie stworzone obiekty
*/
void mpo() {
struct lista *tmp = start;
while(tmp) {
tmp = tmp->next;
free(start->nazwa);
free(start);
start = tmp;
}
}
%}
/**
* Definicja stanu fineline - oznacza, ze linia dotyczy polaczenia danego uzytkownika
* faktyczne sprawdzenie, czy uzytkownik laczy sie ze strona nastepuje pozniej
*/
%s fineline
NUM [0-9]
SIGN [0-9a-zA-Z]+
PREFIX {NUM}{2}":"{NUM}{2}":"{NUM}{2}"."({NUM}+)" IP "{UZYTKOWNIK}"."({NUM}+)" > "
SUFFIX ".80: S"
DEST {SIGN}("."{SIGN})*
%%
{PREFIX} BEGIN(fineline) /* Zmiana stanu skanera, jezeli linia dotyczy odpowiedniego uzytkownika */;
<fineline>{DEST}/{SUFFIX} {
/* Jezeli skaner jest w stanie <fineline> i polaczenie wywolano na port 80 */
if(!wyszukaj(yytext)) { /* Sprawdzenie czy znaleziony adres hosta jest zapisany w kolejce */
printf("%s\n", yytext); /* Wypisanie adresu, jezeli nie znaleziono w kolejce */
dodaj(yytext); /* Dodanie nowego adresu */
}
/* W jezeli adres znaleziono w kolejce, zadna akcja nie jest wywolywana */
}
\n BEGIN(0); /* Koniec linii oznacza powrot do stanu zerowego */
.
%%
int main(int argc, char *argv[]) {
yylex(); /* Wywolanie skanera flex */
mpo(); /* Czyszczenie po pracy */
return 0;
}
Dziękuję za pomoc!
Pozdrawiam