archive_t arch_zip_read(const char* name,int buf){ archive_t arch=(archive_t)HREmalloc(NULL,sizeof(struct archive_s)); arch_init(arch); int err; arch->archive=zip_open(name,ZIP_CHECKCONS,&err); if (arch->archive==NULL){ char errstr[1024]; zip_error_to_str(errstr, sizeof(errstr), err, errno); Abort("cannot open zip archive `%s': %s\n",name , errstr); } arch->stream_index=SIcreate(); #ifdef LIBZIP_VERSION int count=zip_get_num_entries(arch->archive,0); #else int count=zip_get_num_files(arch->archive); #endif for(int i=0;i<count;i++){ struct zip_stat sb; int res=zip_stat_index(arch->archive,i,0,&sb); if (res<0) { Abort("cannot stat zip archive: %s\n",zip_strerror(arch->archive)); } SIputAt(arch->stream_index,sb.name,i); Print(infoShort,"stream %d is %s",i,sb.name); } arch->procs.contains=zip_contains; arch->procs.read=hre_zip_read; arch->procs.read_raw=hre_zip_read_raw; arch->procs.enumerator=zip_enum; arch->procs.close=hre_zip_close; arch->buf=buf; return arch; }
int SIput(string_index_t si,const char*str,int *index) { int idx,res; idx=SIlookup(si,str); /* fprintf(stderr,"SIput1 idx=%d\n",idx); */ if (idx!=SI_INDEX_FAILED) { if (index) *index=idx; return 0; } if (si->free_list==END_OF_LIST) { idx=si->size; } else { idx=si->free_list; } /* fprintf(stderr,"SIput2 idx=%d\n",idx); */ res=SIputAt(si,str,idx); if (res) { return res; } else { *index=idx; return 0; } }