myio_byte_array.c
最終更新:2010/1/21
001: /*
002: * バイト配列をソースとする入力ストリーム
003: */
004:
005: #include "myio_byte_array.h"
006:
007: /*
008: * size バイト分のデータを読み出す関数。
009: * 返り値は buf に読み出したバイト数。
010: * エラー時には -1 が返る。
011: */
012:
013: int myio_read_ba (
014: MYIO *in
015: , char *buf
016: , int size
017: ) {
018: int nbytes = 0;
019: myio_ba_ctx *ctx = (myio_ba_ctx*)(in->ptr);
020: if (!ctx || ! ctx->ba) {
021: return -1;
022: }
023:
024: if (ctx->pos >= ctx->size) {
025: return 0;
026: }
027:
028: if (ctx->pos + size > ctx->size) {
029: nbytes = ctx->size - ctx->pos;
030: } else {
031: nbytes = size;
032: }
033:
034: {
035: int i;
036: for (i=0; i<nbytes; i++) {
037: buf[i] = ctx->ba[ctx->pos + i];
038: }
039: }
040:
041: ctx->pos += nbytes;
042:
043: return nbytes;
044: }
045:
046: MYIO_METHOD myio_ba_method = {
047: MYIO_METHOD_NAME_BA
048: , (void*)0
049: , myio_read_ba
050: , (void*)0
051: , (void*)0
052: };
053:
054:
055: MYIO *MYIO_ba_new (
056: char *ba /* バイト配列 */
057: , int size /* バイト配列のサイズ */
058: , void *alloc_func /* メモリアロケーションの関数 */
059: , void *alloc_func_ctx /* メモリアロケーションの関数のコンテクストデータ */
060: ) {
061: myio_ba_ctx *ctx = (void*)0;
062: MYIO *myio = (void*)0;
063: void * (*alloc_f)(void*,int) = alloc_func;
064: if (!ba || size<=0) {
065: return (void*)0;
066: }
067:
068: if (alloc_f == (void*)0) {
069: return (void*)0;
070: }
071: ctx = (myio_ba_ctx *)alloc_f(alloc_func_ctx, sizeof(myio_ba_ctx));
072:
073: if (!ctx) {
074: return (void*)0;
075: }
076:
077: ctx->ba = ba;
078: ctx->size = size;
079: ctx->pos = 0;
080:
081: myio = (MYIO*)alloc_f(alloc_func_ctx, sizeof(MYIO));
082:
083: if (!myio) {
084: return (void*)0;
085: }
086:
087: return MYIO_make(myio, &myio_ba_method, 1, 0, ctx);
088: }
![]() | KAKU PROJECT (2009) |