All pastes #438525 Raw Edit

unTar

public c v1 · immutable
·published 2007-04-13 17:58 UTC
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;	}