青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Cpper
C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿
#ifndef STREAM_BUFFER_H
#define STREAM_BUFFER_H
#include 
<stdio.h>
#include 
<stdlib.h>
#include 
"gaudio.h"

typedef 
struct _streamBuffer streamBuffer;
//typedef size_t(*streamRead)(void* ctx,void* ptr,size_t size,size_t nmemb);
//typedef int(*streamSeek)(void* ctx,glong offset,int flag);
//typedef int(*streamClose)(void* ctx);

streamBuffer
* stream_open_file(const gchar* file);
streamBuffer
* stream_open_mem(gvoid* mem,gulong size);
streamBuffer
* stream_open_callbacks(gread read,gseek seek,gtell tell,gclose close,gvoid* context);
glong         stream_read(streamBuffer
* stream,gvoid* ptr,gint size,glong nmemb);
glong         stream_seek(streamBuffer
* stream,glong offset,gint flag);
glong         stream_close(streamBuffer
* stream);

#endif
//! by ccsdu2004

#include <stdio.h>
#include 
<string.h>
#include 
"streamBuffer.h"
#include 
"gmemory.h"

struct _streamBuffer
{
    gread  read;
    gseek  seek;
    gclose close;
    gtell  tell;
    
void*  ctx;
};

typedef 
struct _stdIOContext
{
    FILE 
*fp;
}stdIOContext;

glong stdio_stream_read(gvoid
* ptr,gint size,glong nmemb,gvoid* ctx)
{
    
return fread(ptr,size,nmemb,((stdIOContext*)ctx)->fp);
}

glong stdio_stream_seek(gvoid
* ctx,glong offset,gint flag)
{
    
return fseek(((stdIOContext*)ctx)->fp,offset,flag);
}

glong APIENTRY stdio_stream_tell(gvoid
* ctx)
{
    
return ftell(((stdIOContext*)ctx)->fp);
}

glong stdio_stream_close(gvoid
* ptr)
{
    stdIOContext
* ctx = (stdIOContext*)ptr;
    gint ret 
= 0;
    ret 
= fclose(ctx->fp);
    gFreeBuffer(ctx);
    
return ret;
}

typedef 
struct memContext
{
    guchar
* base;
    guchar
* current;
    guchar
* end;
}memContext;

glong mem_stream_read(gvoid
* ptr,gint size,glong nmemb,gvoid* ctx)
{
    streamBuffer
* stream = (streamBuffer*)ctx;
    memContext 
*c;
    glong count;

    c 
= (memContext*)stream;
    count 
= nmemb;

    
if(c->current + count * size > c->end)
        count 
= (c->end - c->current) / size;

    memcpy(ptr, c
->current, count * size);
    c
->current += count * size;
    
return count;
}

glong mem_stream_seek(gvoid
* ctx,glong offset,gint flag)
{
    streamBuffer
* stream = (streamBuffer*)ctx;
    memContext
* c;
    c 
= (memContext*)stream;
    
if(c == NULL)
        
return -1;
    
if(flag == SEEK_SET)
    {
        
if(offset < 0 || offset > c->end - c->base)
            
return -1;
        c
->current = c->base + offset;
        
return 0;
    }
    
else if(flag == SEEK_CUR)
    {
        
if(offset > 0)
        {
            
if(offset > c->end - c->current)
                
return -1;
            c
->current += offset;
            
return 0;
        }
        
else if(offset < 0)
        {
            
if(-offset > c->current - c->base)
                
return -1;
            c
->current += offset;
            
return 0;
        }
    }
    
else if(flag == SEEK_END)
    {
        
if(offset > 0 || offset > c->end - c->base)
            
return -1;
        c
->current = c->end - offset;
        
return 0;
    }
    
return -1;
}

glong mem_stream_close(gvoid 
*ptr)
{
    memContext
* ctx = (memContext*)ptr;
    gFreeBuffer(ctx
->base);
    gFreeBuffer(ctx);
    
return 0;
}

streamBuffer
* stream_open_fp(FILE* fp)
{
    stdIOContext
* ctx;
    streamBuffer
* stream;

    stream 
= gcreate_buffer<streamBuffer>(1);
    
if(stream == NULL)
        
return NULL;

    ctx 
= gcreate_buffer<stdIOContext>(1);
    
if(ctx == NULL)
    {
        gFreeBuffer(stream);
        
return NULL;
    }

    ctx
->fp = fp;
    stream
->ctx = ctx;
    stream
->read = stdio_stream_read;
    stream
->seek = stdio_stream_seek;
    stream
->close = stdio_stream_close;
    
return stream;
}

streamBuffer
* stream_open_file(const gchar *file)
{
    FILE 
*fp;
    fp 
= fopen((char*)file,"rb");
    
if(fp == NULL)
       
return NULL;
    
return stream_open_fp(fp);
}

streamBuffer
* stream_open_mem(gvoid* mem,gulong size)
{
    memContext
*   ctx;
    streamBuffer
* stream;

    stream 
= gcreate_buffer<streamBuffer>(1);
    
if(stream == NULL)
        
return NULL;

    ctx 
= gcreate_buffer<memContext>(1);
    
if(ctx == NULL)
    {
        gFreeBuffer(stream);
        
return NULL;
    }

    ctx
->base = (guchar*)mem;
    ctx
->current = (guchar*)mem;
    ctx
->end = ((guchar*) mem) + size;

    stream
->ctx = ctx;
    stream
->read = mem_stream_read;
    stream
->seek = mem_stream_seek;
    stream
->close = mem_stream_close;

    
return stream;
}

streamBuffer
* stream_open_callbacks(gread read,gseek seek,gtell tell,gclose close,gvoid* context)
{
    streamBuffer
* stream = gcreate_buffer<streamBuffer>(1);
    
if(stream == NULL)
       
return NULL;

    stream
->ctx = context;
    stream
->read = read;
    stream
->seek = seek;
    stream
->tell = tell;
    stream
->close = close;
    
return stream;
}

glong stream_read(streamBuffer
* stream,gvoid* ptr,gint size,glong nmemb)
{
    
return stream->read(ptr,size,nmemb,stream->ctx);
}

glong stream_seek(streamBuffer
* stream,glong offset,gint flag)
{
    
return stream->seek(stream,offset,flag);
    
/*size_t c;
    char tmp[1024];
    while(offset > 0)
    {
        c = offset;
        if(c > 1024)
           c = 1024;
        offset -= c;

        if(c != stream_read(stream,tmp,1,c))
        {
        }
    }
    return 1;
*/
}

glong stream_close(streamBuffer
* stream)
{
    gint ret 
= stream->close(stream->ctx);
    gFreeBuffer(stream);
    
return ret;
}
posted on 2013-04-09 20:56 ccsdu2009 閱讀(661) 評論(0)  編輯 收藏 引用 所屬分類: 編程基礎
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲电影毛片| 夜夜嗨av一区二区三区四区| 亚洲一区二区三区四区中文| 国产精品久久久一区二区| 国产视频久久久久| 一本色道久久综合亚洲91| 亚洲免费视频成人| 欧美资源在线| 99re66热这里只有精品3直播| 亚洲美女精品一区| 国内精品福利| 欧美大片在线看| 亚洲午夜极品| 亚洲午夜av| 久久久精品免费视频| 国产精品人成在线观看免费| 午夜精品三级视频福利| 亚洲精品久久嫩草网站秘色| 欧美+亚洲+精品+三区| 亚洲茄子视频| 国产精品免费观看在线| 国产欧美日本在线| 欧美激情综合色| 亚洲欧美制服中文字幕| 性色av一区二区怡红| 日韩午夜电影av| 精品99一区二区| 国产精品日韩欧美一区二区| 久久婷婷蜜乳一本欲蜜臀| 亚洲蜜桃精久久久久久久| 国产日韩欧美一区二区| 亚洲九九爱视频| 久久免费视频在线| 久久人人爽国产| 国产亚洲在线| 伊人激情综合| 亚洲国产精品第一区二区三区| 狠狠色丁香久久婷婷综合丁香| 韩国一区电影| 午夜一级久久| 一区二区三区久久网| 亚洲一区二区三区国产| 羞羞答答国产精品www一本| 欧美精品一区二区三区在线看午夜| 久久影音先锋| 欧美日韩在线播放| 国产欧美精品在线观看| 中文一区在线| 午夜精品久久久久久99热| 美女国产一区| 亚洲一区高清| 国产主播在线一区| 国产日韩欧美不卡在线| 在线亚洲欧美视频| 欧美影视一区| 91久久中文| 欧美影院在线播放| 欧美激情视频一区二区三区在线播放| 亚洲美女诱惑| 一区二区三区久久网| 国内精品久久久久久久影视麻豆| 久久在线91| 久久偷看各类wc女厕嘘嘘偷窃| 另类激情亚洲| 亚洲综合第一| 亚洲美女在线看| 宅男噜噜噜66一区二区| 久久久精品网| 亚洲激情网站| 欧美v亚洲v综合ⅴ国产v| 国产精品亚洲人在线观看| 另类激情亚洲| 欧美一级淫片aaaaaaa视频| 欧美色精品在线视频| 亚洲欧美综合另类中字| 久久欧美肥婆一二区| 一区二区三区在线视频免费观看| 亚洲国产精品嫩草影院| 欧美成人小视频| 久久久亚洲欧洲日产国码αv| 国产在线播放一区二区三区| 亚洲一区二区三区在线| 黄色一区二区三区| 99精品欧美一区二区蜜桃免费| 亚洲一级在线| 欧美日韩国产首页在线观看| 在线日韩精品视频| 久久婷婷成人综合色| 欧美大片免费久久精品三p | 久久婷婷麻豆| 亚洲精品美女久久久久| 亚洲精品美女久久7777777| 伊人久久久大香线蕉综合直播| 玖玖国产精品视频| 影音先锋中文字幕一区二区| 国产亚洲欧洲一区高清在线观看| 欧美亚一区二区| 久久综合一区| 久久精品一区二区三区四区| 午夜日本精品| 久久精品1区| 亚洲精品影院| 欧美一区二区三区啪啪| 欧美一二三视频| 好吊色欧美一区二区三区四区| 欧美大尺度在线观看| 亚洲欧美大片| 亚洲精品看片| 国产精品久久综合| 亚洲电影免费观看高清| 欧美国产免费| 亚洲电影成人| 亚洲精品少妇30p| 99国产麻豆精品| 亚洲一二三区精品| 亚洲永久在线| 亚洲深夜福利视频| 亚洲成人自拍视频| 黄色成人精品网站| 亚洲精品麻豆| 日韩视频亚洲视频| 亚洲国产精品久久久久秋霞不卡| 国产免费一区二区三区香蕉精| 亚洲欧美日韩精品久久亚洲区| 亚洲一二三区视频在线观看| 午夜亚洲视频| 欧美大香线蕉线伊人久久国产精品| 欧美大尺度在线观看| 欧美国产国产综合| 国产精品国产三级国产普通话99| 一本色道久久综合亚洲精品不 | 午夜精品福利一区二区三区av| 亚洲欧美国产另类| 欧美一二区视频| 免费观看成人| 欧美chengren| 久久精品国产亚洲一区二区| 欧美精品激情在线| 亚洲国产日韩欧美在线动漫 | 免费成人av在线| 9国产精品视频| 亚洲精品久久在线| 欧美日韩亚洲一区二| 影音先锋日韩精品| 亚洲欧美日韩国产一区二区| 亚洲精品欧美日韩专区| 欧美激情久久久| 亚洲激情影院| 香蕉亚洲视频| 亚洲美女在线看| 欧美日韩综合另类| 欧美日本中文| 久久av在线| 国产精品国产三级国产 | 欧美在线观看你懂的| 亚洲欧美日韩另类精品一区二区三区| 欧美午夜不卡视频| 久久久99免费视频| 欧美激情在线| 欧美一级片在线播放| 新狼窝色av性久久久久久| 在线看一区二区| 在线综合视频| 欧美一区二区三区另类 | 午夜精品福利视频| 在线看片欧美| 亚洲欧美日韩国产综合在线| 亚洲国产婷婷香蕉久久久久久99| 香蕉成人啪国产精品视频综合网| 欧美中文字幕在线播放| 欧美三级不卡| 免费精品视频| 国内精品一区二区三区| 亚洲欧美国产77777| 久久av免费一区| 欧美四级电影网站| 亚洲精品欧美| 亚洲精品欧美极品| 久久久综合精品| 久久理论片午夜琪琪电影网| 国产精品爽黄69| 欧美专区福利在线| 欧美a级片一区| 亚洲黄色在线观看| 久久日韩粉嫩一区二区三区| 久久男女视频| 亚洲国产精品精华液2区45| 久久人人爽爽爽人久久久| 亚洲电影免费在线| 亚洲精品你懂的| 欧美婷婷在线| 久久高清福利视频| 激情自拍一区| 欧美精品久久久久久久久久| 亚洲欧美日韩在线高清直播| 蜜桃av一区| 久久国产免费| 亚洲欧美在线磁力| 亚洲综合色网站| 亚洲一区二区影院|