// ********************** // * morpher.c * // * 10.3.2007 * // * Jernej Virag * // ********************** #include #include //lastni headerji, zaradi večje preglednosti #include "head.h" #include "tail.h" #include "cat.h" #include "ls.h" #include "ll.h" int main(int argc, char* argv[]) { //pogosto je podana polna pot, izločimo samo ime binarya char* klic; klic = strrchr(argv[0],'/')+1; //switch ne spremejema stringov... moramo iti ročno //generični klic if (!strcmp(klic,"Metamorfoze")) printf("To ne dela nič. Pokliči program preko ustreznega symlinka."); //head ukaz if (!strcmp(klic,"head")) head(argv[1]); //tail ukaz if (!strcmp(klic,"tail")) tail(argv[1]); //cat ukaz if (!strcmp(klic,"cat")) cat(&argv[1]); //pošlemo vse argumente razen prvoga //ls ukaz if (!strcmp(klic,"ls")) ls(&argv[1]); //pošlemo vse argumente razen prvoga //ll ukaz if (!strcmp(klic,"ll")) ll(&argv[1]); return 0; } // ********************************** // * cat.h * // * * // * Izpiše vsebino datotek * // * * // ********************************** void cat(char* datoteke[]) { int i=0; //pogledamo če je kaj podanega if (datoteke[i]==NULL) {printf ("Podajte seznam datotek.\n"); return;}; FILE *fajl; char znak; while(datoteke[i]!=NULL) { printf("\nIzpisujem %s: \n",datoteke[i]); fajl=fopen(datoteke[i],"r"); if (fajl==NULL) {i++;continue;} while((znak=fgetc(fajl))!=EOF) printf("%c",znak); fclose(fajl); i++; } printf("KONEC IZPISA \n"); }; // ********************************** // * head.h * // * * // * Izpiše prvih 5 vrstic datoteke * // * * // ********************************** void head(char* datoteka) { int i; // pogledamo če nam je uporabnik sploh datoteko dal if (datoteka==NULL) { printf("Prosimo, podajte ime datoteke."); return; } FILE *fajl; fajl = fopen(datoteka,"r"); char vrstica[255]; //beremo vrstice samo do 255 znakov. if (fajl == NULL) { printf("Napaka pri odpiranju datoteke. \n"); return; } for (i=0;i<5;i++) { if (fgets(vrstica,255,fajl)==NULL) break; printf("%s",vrstica); } fclose(fajl); } // ************************************** // * ll.h * // * * // * Vrne informacije o datoteki * // * * // ************************************** #include #define F_MODE fileInfo.st_mode void ll(char* datoteke[]) { int i=0; //potrebne spremenljivke char fileName[255]; int fileSize=0; char dovoljenja[10]; //za lažji izpis dovoljenj struct stat fileInfo; while(datoteke[i]!=NULL) { memset(dovoljenja,'-',sizeof(dovoljenja)); // napolnimo array z minus znaki dovoljenja[9]='\0'; // zaključimo zadevo strcpy(fileName,datoteke[i]); //ime datoteke stat(fileName,&fileInfo); //{i++;continue;} fileSize=fileInfo.st_size; // velikost datoteke //obdelamo pravice dostopa - to se verjetno da lažje narediti s kakimi bitnimi operacijami if (S_IRUSR & F_MODE) dovoljenja[0]='r'; if (S_IWUSR & F_MODE) dovoljenja[1]='w'; if (S_IXUSR & F_MODE) dovoljenja[2]='x'; if (S_IRGRP & F_MODE) dovoljenja[3]='r'; if (S_IWGRP & F_MODE) dovoljenja[4]='w'; if (S_IXGRP & F_MODE) dovoljenja[5]='x'; if (S_IROTH & F_MODE) dovoljenja[6]='r'; if (S_IWOTH & F_MODE) dovoljenja[7]='w'; if (S_IXOTH & F_MODE) dovoljenja[8]='x'; //izpis vsega printf("%s %d %s",fileName,fileSize,dovoljenja); //še pogledamo če je direktorij if (S_ISDIR(F_MODE)) printf(" DIR \n"); else printf("\n"); i++; } } // ************************************** // * ls.h * // * * // * Opravla funkcijo podobno ls ukazu * // * * // ************************************** #include #include void ls(char* datoteke[]) { int i=0; struct stat fInfo; //informacije o datoteki; DIR *direktorij; struct dirent* dirp; //struktura ki hrani vsebino direktorija while(datoteke[i]!=NULL) { stat(datoteke[i],&fInfo); //dobimo info o datoteki if (S_ISDIR(fInfo.st_mode)) //preverimo če je direktorij { direktorij=opendir(datoteke[i]); if (!direktorij) {i++; continue;} while((dirp = readdir(direktorij)) != NULL) //izpišemo direktorij { printf("%s\n",dirp->d_name); } } else printf("%s\n",datoteke[i]); i++; } } // ************************************** // * tail.h * // * * // * Izpiše zadnjih 5 vrstic datoteke * // * * // ************************************** void tail(char* datoteka) { //deklaracije char znak; fpos_t polozaji[6]; //shrani položaje koncev zadnjih šestih vrstic int counter = 0; FILE *fajl; int daljsa=0; //če je datoteka krajša od 5 vrstic bi se dogajale obskurnosti //pogledamo če nam je uporabnik sploh datoteko dal if (datoteka==NULL) { printf("Prosimo, podajte ime datoteke."); return; } fajl = fopen(datoteka,"r"); if (fajl==NULL) {printf("Napaka pri odpiranjudatoteke.\n"); return;}; while(!feof(fajl)) { znak=fgetc(fajl); if (znak==(char)10) { fgetpos(fajl,&polozaji[counter]); counter++; if (counter > 5) { counter = 0; //resetiramo counter in označimo, da je datoteka daljša od 5 vrstic daljsa=1; } } } //nastavimo položaj za izpis if (daljsa) fsetpos(fajl,&polozaji[counter]); else rewind(fajl); while((znak=fgetc(fajl))!=EOF) { printf("%c",znak); }; fclose(fajl); };