Ejemplo n.º 1
0
extern zipFile ZEXPORT zipOpen (const char *pathname, int append)
{
    zip_internal ziinit;
    zip_internal* zi;

    ziinit.filezip = fopen(pathname,(append == 0) ? "wb" : "ab");
    if (ziinit.filezip == NULL)
        return NULL;
    ziinit.begin_pos = ftell(ziinit.filezip);
    ziinit.in_opened_file_inzip = 0;
    ziinit.ci.stream_initialised = 0;
    ziinit.number_entry = 0;
    init_linkedlist(&(ziinit.central_dir));


    zi = (zip_internal*)ALLOC(sizeof(zip_internal));
    if (zi==NULL)
    {
        fclose(ziinit.filezip);
        return NULL;
    }

    *zi = ziinit;
    return (zipFile)zi;
}
Ejemplo n.º 2
0
/*
 * 作者:玩命
 * 开始日期:2009-1-1
 * 完成日期:2009-1-1
 * 参数:
 *    n:要生成链表的节点数目.
 * 返回值:
 *    链表头节点指针.
 * 说明:
 *    初始化一条链表.
 */
PLINKEDLIST_NODE init_linkedlist(dword_t n) {
	PLINKEDLIST_NODE node;
	if (!n) return NULL;
	node = (PLINKEDLIST_NODE)logic_malloc(sizeof(LINKEDLIST_NODE));
	assert(node);
	node->next = init_linkedlist(n-1);
	if (node->next) (node->next)->previous = node;
	node->previous = NULL;	
	return node;
}/* end init_linkedlist */
Ejemplo n.º 3
0
int main(int argc, char** argv) {
	LinkedList tmp_ll = init_linkedlist();
	tmp_ll = add_head(tmp_ll, 14);
	tmp_ll = add_head(tmp_ll, 17);
	print_linkedlist(tmp_ll);

    /* tmp_ll = add_head(tmp_ll, 13);
    tmp_ll = add_head(tmp_ll, 14);
    tmp_ll = remove_head(tmp_ll);
    tmp_ll = add_tail(tmp_ll, 17);
    tmp_ll = remove_tail(tmp_ll);*/
    tmp_ll = empty_linkedlist(tmp_ll);

    print_linkedlist(tmp_ll);

    return EXIT_SUCCESS;
}
Ejemplo n.º 4
0
extern MINIZIP_EXPORT zipFile zipOpen2 (const char *pathname,int append,zipcharpc* globalcomment,zlib_filefunc_def* pzlib_filefunc_def)

{
  zip_internal ziinit;
  zip_internal* zi;
  int err=ZIP_OK;


  if (pzlib_filefunc_def==0)
    fill_fopen_filefunc(&ziinit.z_filefunc);
  else
    ziinit.z_filefunc = *pzlib_filefunc_def;

  ziinit.filestream = (*(ziinit.z_filefunc.zopen_file))
    (ziinit.z_filefunc.opaque,
     pathname,
     (append == APPEND_STATUS_CREATE) ?
     (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :
     (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));

  if (ziinit.filestream == 0)
    return 0;
  ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream);
  ziinit.in_opened_file_inzip = 0;
  ziinit.ci.stream_initialised = 0;
  ziinit.number_entry = 0;
  ziinit.add_position_when_writting_offset = 0;
  init_linkedlist(&(ziinit.central_dir));


  zi = (zip_internal*)ALLOC(sizeof(zip_internal));
  if (zi==0)
    {
      ZCLOSE(ziinit.z_filefunc,ziinit.filestream);
      return 0;
    }

  /* now we add file in a zipfile */
#    ifndef NO_ADDFILEINEXISTINGZIP
  ziinit.globalcomment = 0;
  if (append == APPEND_STATUS_ADDINZIP)
    {
      uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/

      uLong size_central_dir;     /* size of the central directory  */
      uLong offset_central_dir;   /* offset of start of central directory */
      uLong central_pos,uL;

      uLong number_disk;          /* number of the current dist, used for
                                     spaning ZIP, unsupported, always 0*/
      uLong number_disk_with_CD;  /* number the the disk with central dir, used
                                     for spaning ZIP, unsupported, always 0*/
      uLong number_entry;
      uLong number_entry_CD;      /* total number of entries in
                                     the central dir
                                     (same than number_entry on nospan) */
      uLong size_comment;

      central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream);
      if (central_pos==0)
        err=ZIP_ERRNO;

      if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
                central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
        err=ZIP_ERRNO;

      /* the signature, already checked */
      if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK)
        err=ZIP_ERRNO;

      /* number of this disk */
      if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK)
        err=ZIP_ERRNO;

      /* number of the disk with the start of the central directory */
      if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK)
        err=ZIP_ERRNO;

      /* total number of entries in the central dir on this disk */
      if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK)
        err=ZIP_ERRNO;

      /* total number of entries in the central dir */
      if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK)
        err=ZIP_ERRNO;

      if ((number_entry_CD!=number_entry) ||
          (number_disk_with_CD!=0) ||
          (number_disk!=0))
        err=ZIP_BADZIPFILE;

      /* size of the central directory */
      if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK)
        err=ZIP_ERRNO;

      /* offset of start of central directory with respect to the
         starting disk number */
      if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK)
        err=ZIP_ERRNO;

      /* zipfile global comment length */
      if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK)
        err=ZIP_ERRNO;

      if ((central_pos<offset_central_dir+size_central_dir) &&
          (err==ZIP_OK))
        err=ZIP_BADZIPFILE;

      if (err!=ZIP_OK)
        {
          ZCLOSE(ziinit.z_filefunc, ziinit.filestream);
          return 0;
        }

      if (size_comment>0)
        {
          ziinit.globalcomment = ALLOC(size_comment+1);
          if (ziinit.globalcomment)
            {
              size_comment = ZREAD(ziinit.z_filefunc,
                                   ziinit.filestream,
                                   ziinit.globalcomment,
                                   size_comment);
              ziinit.globalcomment[size_comment]=0;
            }
        }

      byte_before_the_zipfile = central_pos -
                                (offset_central_dir+size_central_dir);
      ziinit.add_position_when_writting_offset = byte_before_the_zipfile;

      {
        uLong size_central_dir_to_read = size_central_dir;
        size_t buf_size = SIZEDATA_INDATABLOCK;
        void* buf_read = (void*)ALLOC(buf_size);
        if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
                  offset_central_dir + byte_before_the_zipfile,
                  ZLIB_FILEFUNC_SEEK_SET) != 0)
          err=ZIP_ERRNO;

        while ((size_central_dir_to_read>0) && (err==ZIP_OK))
          {
            uLong read_this = SIZEDATA_INDATABLOCK;
            if (read_this > size_central_dir_to_read)
              read_this = size_central_dir_to_read;
            if (ZREAD(ziinit.z_filefunc,
                      ziinit.filestream,
                      buf_read,
                      read_this) != read_this)
              err=ZIP_ERRNO;

            if (err==ZIP_OK)
              err = add_data_in_datablock(&ziinit.central_dir,buf_read,
                                          (uLong)read_this);
            size_central_dir_to_read-=read_this;
          }
        TRYFREE(buf_read);
      }
      ziinit.begin_pos = byte_before_the_zipfile;
      ziinit.number_entry = number_entry_CD;

      if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
                offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
        err=ZIP_ERRNO;
    }

  if (globalcomment)
    {
      *globalcomment = ziinit.globalcomment;
    }
#    endif /* !NO_ADDFILEINEXISTINGZIP*/

  if (err != ZIP_OK)
    {
#    ifndef NO_ADDFILEINEXISTINGZIP
      TRYFREE(ziinit.globalcomment);
#    endif /* !NO_ADDFILEINEXISTINGZIP*/
      TRYFREE(zi);
      return 0;
    }
  else
    {
      *zi = ziinit;
      return (zipFile)zi;
    }
}