Example #1
0
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;
}
Example #2
0
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;
    }
}