/* tail.c - izdaje poslednjih n linija datoteke */ #include #include #include #define MAXL 201 /* dopusta 200 karaktera po redu */ typedef char * PCHAR; /* pokazivac na tip podataka char */ int ntail = 10; /* broj redova u izlazu */ main(argc,argv) int argc; char *argv[]; { long l, nl; /* broj redova i brojac redova */ PCHAR pline; /* pokazivac na prostor red a */ PCHAR *lines; /* pocetak niza pokazivaca redova */ /* uzima broj redova u repu */ if( argc > 1 ) sscanf( argv[1], "%d", &ntail ); /* alociranje niza pokazivaca redova */ lines = (PCHAR *) calloc(ntail, sizeof(PCHAR)); if( lines == NULL ) { fprintf(stderr, "ne moze da se alocira prostor \n"); exit(10);} for( l = 0; l < ntail; l++ ) { lines[l] = (char *) malloc( MAXL ); if( lines[l] == NULL ) { fprintf(stderr, "ne moze da se alocira prostor \n"); exit(20);} } nl = 0; while( 1 == 1 ) { pline = lines[ nl % ntail ]; /* pokazuje sledeci red */ if( fgets( pline, MAXL-l,stdin) == NULL ) /* uzima sledeci red */ break; /* i ispituje kraj reda */ nl = nl + 1; } if( nl >= ntail ) /* nalazi pocetak niza repa */ l = nl - ntail; else l = 0; while( l < nl ) { pline = lines[ l % ntail ]; fputs(pline, stdout); l = l + 1; } for( l = 0; l < ntail; l++) { free(lines[l]);} free(lines); }