rendered paste body// ******************************************// * unTar - razpakiranje datotek iz arhiva *// * *// * Jernej Virag *// ******************************************#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct{ char ime[FILENAME_MAX]; long offset;} F_Info;int main(int argc,char* argv[]){ if (argc<2) {printf("Manjkajo argumenti.\n"); return -1;} FILE *arhiv; FILE *output; char *buffer; F_Info *fileinfo; int i=0,j=0; long headerpos; //položaj zaÄetka fileinfoja arhiv=fopen(argv[1],"rb"); if (arhiv==NULL) {printf("Napaka pri odpiranju arhiva."); return -1;} //najprej preverimo, Äe je arhiv sploh legalen buffer=(char*)malloc(4*sizeof(char)); memset(buffer,'\0',4); //inicializiramo fread(buffer,sizeof(char),3, arhiv); if(strcmp(buffer,"ARH\0")) {printf("Datoteka ni veljaven arhiv!\n"); return -1;} //pogledamo kje se zaÄnejo informacije o datotekah fseek(arhiv,-sizeof(long),SEEK_END); fread(&headerpos,sizeof(long),1,arhiv); //pomaknemo se na zaÄetek infoja fseek(arhiv,headerpos,SEEK_SET); fileinfo=(F_Info*)malloc(sizeof(F_Info)); buffer=realloc(buffer,sizeof(char)); //zmanjÅ¡amo buffer na velikost //enega znaka i=0; *buffer=fgetc(arhiv); while(!feof(arhiv)) { fileinfo=(F_Info*)realloc(fileinfo,(i+1)*sizeof(F_Info)); fileinfo[i].ime[0]='\0'; do { *buffer=fgetc(arhiv); strncat(fileinfo[i].ime,buffer,1); } while(*buffer!='\0'&&!feof(arhiv)); fread(&fileinfo[i].offset,sizeof(long),1,arhiv); printf("Najdena datoteka %s z offsetfom %ld.\n",fileinfo[i].ime,fileinfo[i].offset); i++; }; i--; fileinfo[i].offset=headerpos; //gremo pisat fajle... konÄno for(j=0;j<i;j++) { output=fopen(fileinfo[j].ime,"wb"); if (output==NULL) {printf("Napaka pri pisanju!"); break;}; fseek(arhiv,fileinfo[j].offset,SEEK_SET); printf("PiÅ¡em %s na mestu %ld.\n",fileinfo[j].ime,ftell(arhiv)); while(ftell(arhiv)!=fileinfo[j+1].offset) { fread(buffer,sizeof(char),1,arhiv); fwrite(buffer,sizeof(char),1,output); } fclose(output); } printf("KonÄano!\n"); return 0; }