Back to index

php5  5.3.10
Classes | Functions
zip_source_buffer.c File Reference
#include <stdlib.h>
#include <string.h>
#include "zipint.h"

Go to the source code of this file.

Classes

struct  read_data

Functions

static ssize_t read_data (void *state, void *data, size_t len, enum zip_source_cmd cmd)
 zip_source_buffer (struct zip *za, const void *data, off_t len, int freep)

Class Documentation

struct read_data

Definition at line 41 of file zip_source_buffer.c.

Class Members
const char * buf
const char * data
const char * end
int freep
time_t mtime

Function Documentation

static ssize_t read_data ( void *  state,
void *  data,
size_t  len,
enum zip_source_cmd  cmd 
) [static]

Definition at line 87 of file zip_source_buffer.c.

{
    struct read_data *z;
    char *buf;
    size_t n;

    z = (struct read_data *)state;
    buf = (char *)data;

    switch (cmd) {
    case ZIP_SOURCE_OPEN:
       z->buf = z->data;
       return 0;
       
    case ZIP_SOURCE_READ:
       n = z->end - z->buf;
       if (n > len)
           n = len;

       if (n) {
           memcpy(buf, z->buf, n);
           z->buf += n;
       }

       return n;
       
    case ZIP_SOURCE_CLOSE:
       return 0;

    case ZIP_SOURCE_STAT:
        {
           struct zip_stat *st;
           
           if (len < sizeof(*st))
              return -1;

           st = (struct zip_stat *)data;

           zip_stat_init(st);
           st->mtime = z->mtime;
           st->size = z->end - z->data;
           
           return sizeof(*st);
       }

    case ZIP_SOURCE_ERROR:
       {
           int *e;

           if (len < sizeof(int)*2)
              return -1;

           e = (int *)data;
           e[0] = e[1] = 0;
       }
       return sizeof(int)*2;

    case ZIP_SOURCE_FREE:
       if (z->freep) {
           free((void *)z->data);
           z->data = NULL;
       }
       free(z);
       return 0;

    default:
       ;
    }

    return -1;
}

Here is the call graph for this function:

zip_source_buffer ( struct zip za,
const void *  data,
off_t  len,
int  freep 
)

Definition at line 53 of file zip_source_buffer.c.

{
    struct read_data *f;
    struct zip_source *zs;

    if (za == NULL)
       return NULL;

    if (len < 0 || (data == NULL && len > 0)) {
       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
       return NULL;
    }

    if ((f=(struct read_data *)malloc(sizeof(*f))) == NULL) {
       _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
       return NULL;
    }

    f->data = (const char *)data;
    f->end = ((const char *)data)+len;
    f->freep = freep;
    f->mtime = time(NULL);
    
    if ((zs=zip_source_function(za, read_data, f)) == NULL) {
       free(f);
       return NULL;
    }

    return zs;
}

Here is the call graph for this function:

Here is the caller graph for this function: