/** @brief Buffer型サポートプログラム @file buffer.c @version 1.3 @author Fumi.Iseki (C) @date 2012 7/23 @see Buffer */ #include "buffer.h" #include "jbxl_state.h" /** Buffer* new_Buffer(int sz) 空のBuffer型変数を生成する. @param sz Buffer型変数のバッファの大きさ.0以下の場合は,バッファ部は作成しない. @return つくり出した Buffer型変数へのポインタ.作成に失敗した場合はNULLが返る. */ Buffer* new_Buffer(int sz) { Buffer* buf; buf = (Buffer*)malloc(sizeof(Buffer)); if (buf==NULL) return NULL; memset(buf, 0, sizeof(Buffer)); buf->vldsz = -1; buf->state = JBXL_NORMAL; if (sz>0) *buf = make_Buffer(sz + 1); return buf; } /** Buffer init_Buffer() 初期化したBuffer型変数を返す. @attention a = init_Buffer() とした場合,aに元々値が入っていても,その値は freeされないので注意. @return 初期化されたBuffer型変数. */ Buffer init_Buffer() { Buffer buf; memset(&buf, 0, sizeof(Buffer)); buf.vldsz = -1; buf.state = JBXL_NORMAL; return buf; } /** Buffer make_Buffer(int sz) Buffer型変数のバッファ部をつくり出す. sz は Buffer型変数のバッファの大きさ.@n バッファ部は 0x00で初期化される.bufsz=sz, vldsz=0 となる.@n バッファ部の作成に失敗した場合,バッファのサイズ(bufsz)は 0,バッファへのポインタは NULLとなる. @param sz Buffer型変数のバッファの大きさ. @return 作り出した Buffer型変数. */ Buffer make_Buffer(int sz) { Buffer buf; memset(&buf, 0, sizeof(Buffer)); buf.state = JBXL_NORMAL; if (sz<0) return buf; buf.bufsz = sz; buf.buf = (unsigned char*)malloc(buf.bufsz+1); if (buf.buf==NULL) { buf.bufsz = 0; buf.vldsz = -1; buf.state = JBXL_ERROR; } else { memset(buf.buf, 0, buf.bufsz+1); } return buf; } /** Buffer make_Buffer_bychar(unsigned char cc) 文字から,Buffer型変数のバッファ部をつくり出す. make_Buffer_bychar('@\0') は Buffer変数の初期化にも使用される. @param cc Buffer型変数のバッファに格納する文字 @return つくり出した Buffer型変数.バッファ部の作成に失敗した場合, @return バッファのサイズ(bufsz)は 0,バッファへのポインタは NULLとなる. @see make_Buffer_bystr() */ Buffer make_Buffer_bychar(unsigned char cc) { Buffer buf; buf = make_Buffer(LADDR); if (buf.buf==NULL) return buf; buf.buf[0] = cc; buf.vldsz = 1; return buf; } /** void free_Buffer(Buffer* buf) Buffer型変数のバッファ部を解放する. @param buf 開放するバッファを持った Bufferデータへのポインタ. */ void free_Buffer(Buffer* buf) { if (buf!=NULL) { if (buf->buf!=NULL) free(buf->buf); buf->buf = NULL; memset(buf, 0, sizeof(Buffer)); buf->vldsz = -1; buf->state = JBXL_NORMAL; } } /** void del_Buffer(Buffer** buf) new_Buffer()で作り出した Buffer型変数を削除する. @param buf 削除する Bufferデータのポインタへのポインタ. @see new_Buffer() */ void del_Buffer(Buffer** buf) { if (buf!=NULL && *buf!=NULL) { if ((*buf)->buf!=NULL) free((*buf)->buf); (*buf)->buf = NULL; free(*buf); *buf = NULL; } } /** Buffer set_Buffer(void* dat, int len) Buffer型変数のバッファ部を新しく作り, そのバッファに bufをコピーする.@n lenはコピーするデータ長.もし lenが 0未満の場合は, bufは文字列として扱われる.@n buf が文字列の場合は make_Buffer_bystr() も使用可能. @param dat コピーするバッファへのポインタ. @param len バッファ長(バイト単位). @return 新しく作られた Buffer型データ. */ Buffer set_Buffer(void* dat, int len) { Buffer buf; buf = init_Buffer(); if (dat==NULL) return buf; if (len<0) len = (int)strlen((char*)dat); buf = make_Buffer(len); if (buf.buf==NULL) return buf; memcpy(buf.buf, dat, len); buf.vldsz = len; return buf; } /** Buffer make_Buffer_randomstr(int n) ランダムな n文字から,Buffer型変数のバッファ部をつくり出す. */ Buffer make_Buffer_randomstr(int n) { char* str = random_str(n); Buffer buf = set_Buffer(str, -1); free(str); return buf; } /** Buffer dup_Buffer(Buffer buf) Buffer型変数のコピーをつくる. @param buf コピーする変数. @return 新しく作られた Buffer型データ. */ Buffer dup_Buffer(Buffer buf) { Buffer str = buf; if (buf.bufsz>=0 && buf.buf!=NULL) { str.buf = (unsigned char*)malloc(buf.bufsz+1); memcpy(str.buf, buf.buf, buf.bufsz); str.buf[buf.bufsz] = '\0'; } // return str; } /** Buffer rept_Buffer(unsigned char cc, int n) 文字 ccを n回繰り返したBuffer型データを返す. @param cc 繰り返す文字. @param n 繰り返す回数. @return 新しく作られた Buffer型データ. */ Buffer rept_Buffer(unsigned char cc, int n) { int i; Buffer str; if (n<=0) n = 1; str = make_Buffer(n); for (i=0; ibufsz>len) return; Buffer expand = make_Buffer(len); copy_Buffer(buf, &expand); free_Buffer(buf); *buf = expand; } /** void clear_Buffer(Buffer* str) Buffer型変数 のバッファ部を 0クリアする. @param str クリアする Buffer型データへのポインタ. */ void clear_Buffer(Buffer* str) { if (str->buf!=NULL) memset(str->buf, 0, str->bufsz+1); str->vldsz = 0; str->state = JBXL_NORMAL; } /** int copy_Buffer(Buffer* src, Buffer* dst) Buffer型変数 srcから dstへバッファをコピーする. もし, dstに srcのバッファをコピーするだけのスペースが無い場合は, 新たにバッファ領域を確保してコピーする. @param src コピー元へのポインタ. @param dst コピー先へのポインタ. @retval 0以上 dstのバッファにコピーされた文字数. @retval JBXL_NULL_EEROR srcまたは dstが NULL @retval JBXL_MALLOC_ERROR メモリの確保に失敗した.何も実行されなかった. @attention 注(重要): 関数内で使用する場合,参照型以外の引数に対してこの関数を用いてはいけない. つまり以下のような使い方は間違い. @code func(Buffer buf){ ............... copy_Buffer(&src, &buf); ............... } @endcode これは下記のように変更する. @code func(Buffer* buf){ ............... copy_Buffer(&src, buf); ............... } @endcode 理由:関数内でバッファ部の大きさが変わる可能性があるが, 呼び出した側ではそのことを知ることができない. */ int copy_Buffer(Buffer* src, Buffer* dst) { int sz, dz; if (src==NULL || dst==NULL) return JBXL_NULL_ERROR; if (src->buf==NULL) return JBXL_NULL_ERROR; sz = src->vldsz; if (sz<0) sz = (int)strlen((const char*)src->buf); if (sz==0) return 0; if (dst->bufsz < sz) { unsigned char* buf; //dz = (int)((src->bufsz+1)*BUFFER_FACT); dz = (int)((sz+1)*BUFFER_FACT); buf = (unsigned char*)malloc(dz+1); if (buf==NULL) return JBXL_MALLOC_ERROR; free(dst->buf); dst->bufsz = dz; dst->buf = buf; } //memset(dst->buf, 0, dst->bufsz+1); too late memcpy(dst->buf, src->buf, sz); dst->buf[sz] = '\0'; dst->vldsz = sz; return sz; } /** int cat_Buffer(Buffer* src, Buffer* dst) Buffer変数 srcから dstへバッファを catする. もし, dstに srcの バッファを catするだけのスペースが無い場合は 新たにバッファ領域を確保して catする. @param src cat元へのポインタ. @param dst cat先へのポインタ. @retval 0以上 dstのバッファにコピーされた文字数. @retval JBXL_NULL_EEROR srcまたは dstが NULL @retval JBXL_MALLOC_ERROR メモリの確保に失敗した.何も実行されなかった. @attention 注(重要): 関数内で使用する場合,参照型以外の引数に対してこの関数を用いてはいけない. つまり以下のような使い方は間違い. @code func(Buffer buf){ ............... cat_Buffer(&src, &buf); ............... } @endcode これは下記のように変更する. @code func(Buffer* buf){ ............... cat_Buffer(&src, buf); ............... } @endcode 理由:関数内でバッファ部の大きさが変わる可能性があるが, 呼び出した側ではそのことを知ることができない. */ int cat_Buffer(Buffer* src, Buffer* dst) { int sz, dz; if (src==NULL || dst==NULL) return JBXL_NULL_ERROR; if (src->buf==NULL) return JBXL_NULL_ERROR; sz = src->vldsz; if (sz<0) sz = (int)strlen((const char*)src->buf); if (sz==0) return 0; dz = dst->vldsz; if (dz<0) { if (dst->buf!=NULL) dz = (int)strlen((const char*)dst->buf); else dz = 0; } if (dst->bufsz < sz+dz) { Buffer buf; buf.state = dst->state; buf.bufsz = (int)((dst->bufsz+sz+1)*BUFFER_FACT); buf.vldsz = dz; buf.buf = (unsigned char*)malloc(buf.bufsz+1); if (buf.buf==NULL) return JBXL_MALLOC_ERROR; memcpy(buf.buf, dst->buf, dz); buf.buf[dz] = '\0'; free_Buffer(dst); *dst = buf; /* Buffer buf; // dstの待避 buf.bufsz = dst->bufsz; buf.vldsz = dz; buf.buf = (unsigned char*)malloc(buf.bufsz+1); if (buf.buf==NULL) return JBXL_MALLOC_ERROR; buf.buf[buf.bufsz] = '\0'; memcpy(buf.buf, dst->buf, buf.bufsz); free_Buffer(dst); //dst->bufsz = (int)((buf.bufsz+src->bufsz+1)*BUFFER_FACT); dst->bufsz = (int)((buf.bufsz+sz+1)*BUFFER_FACT); dst->buf = (unsigned char*)malloc(dst->bufsz+1); if (dst->buf==NULL) { *dst = buf; return JBXL_MALLOC_ERROR; } memset(dst->buf, 0, dst->bufsz+1); memcpy(dst->buf, buf.buf, buf.vldsz); free_Buffer(&buf); */ } //memset(dst->buf+dz, 0, dst->bufsz-dz+1); too late memcpy(dst->buf+dz, src->buf, sz); dst->buf[dz+sz] = '\0'; dst->vldsz = sz + dz; return dst->vldsz; } /** int ins_Buffer(Buffer* src, Buffer* dst) Buffer変数 dst の前に src を挿入する. @param src 挿入元のポインタ. @param dst 挿入先へのポインタ. @retval 0以上 dstのバッファにコピーされた文字数. @retval JBXL_NULL_EEROR srcまたは dstが NULL @retval JBXL_MALLOC_ERROR メモリの確保に失敗した.何も実行されなかった. */ int ins_Buffer(Buffer* src, Buffer* dst) { Buffer tmp = make_Buffer(src->bufsz + dst->bufsz); int ret = copy_Buffer(src, &tmp); if (ret<0) { free_Buffer(&tmp); return ret; } ret = cat_Buffer(dst, &tmp); if (ret<0) { free_Buffer(&tmp); return ret; } free_Buffer(dst); *dst = tmp; return dst->vldsz; } /** int copy_b2Buffer(void* src, Buffer* dst, int len) 任意のバイナリデータsrcを Buffer型変数dstへ lenバイト copyする. もし, dstに srcのバッファを copyするだけのスペースが無い場合は新たにバッファ領域を確保して copyする.@n lenが 0未満の場合は, srcは文字列として扱われる. @param src copy元の任意データへのポインタ. @param dst copy先のBuffer型変数へのポインタ. @param len copyするバイト数. @retval 0以上 dstのバッファにコピーされた文字数. @retval JBXL_NULL_EEROR srcまたは dstが NULL @retval JBXL_MALLOC_ERROR メモリの確保に失敗した.何も実行されなかった. @attention 注(重要): 関数内で使用する場合,参照型以外の引数に対してこの関数を用いてはいけない. つまり以下のような使い方は間違い. @code func(Buffer buf){ ............... copy_b2Buffer(&src, &buf, n); ............... } @endcode これは下記のように変更する. @code func(Buffer* buf){ ............... copy_b2Buffer(&src, buf, n); ............... } @endcode 理由:関数内でバッファ部の大きさが変わる可能性があるが, func を呼び出した側ではそのことを知ることができない. */ int copy_b2Buffer(void* src, Buffer* dst, int len) { int sz, dz; if (src==NULL || dst==NULL) return JBXL_NULL_ERROR; if (len<0) sz = (int)strlen((const char*)src); else sz = len; if (sz<=0) return 0; if (dst->bufsz < sz) { unsigned char* buf; dz = (int)((sz+1)*BUFFER_FACT); buf = (unsigned char*)malloc(dz+1); if (buf==NULL) return JBXL_MALLOC_ERROR; if (dst->buf!=NULL) free(dst->buf); dst->bufsz = dz; dst->buf = buf; } memcpy(dst->buf, src, sz); dst->buf[sz] = '\0'; dst->vldsz = sz; dst->state = JBXL_NORMAL; return sz; } /** int cat_b2Buffer(void* src, Buffer* dst, int len) 任意のバイナリデータsrcを Buffer型変数dstへ lenバイト catする. もし, dstに srcのバッファを catするだけのスペースが無い場合は新たにバッファ領域を確保して catする.@n lenが 0未満の場合は, srcは文字列として扱われる. @param src cat元の任意データへのポインタ. @param dst cat先のBuffer型変数へのポインタ. @param len catするバイト数. @retval 0以上 dstのバッファにコピーされた文字数. @retval JBXL_NULL_EEROR srcまたは dstが NULL @retval JBXL_MALLOC_ERROR メモリの確保に失敗した.何も実行されなかった. @attention 注(重要): 関数内で使用する場合,参照型以外の引数に対してこの関数を用いてはいけない. つまり以下のような使い方は間違い. @code func(Buffer buf){ ............... cat_b2Buffer(&src, &buf, n); ............... } @endcode これは下記のように変更する. @code func(Buffer* buf){ ............... cat_b2Buffer(&src, buf, n); ............... } @endcode 理由:関数内でバッファ部の大きさが変わる可能性があるが, func を呼び出した側ではそのことを知ることができない. */ int cat_b2Buffer(void* src, Buffer* dst, int len) { int sz, dz; if (src==NULL || dst==NULL) return JBXL_NULL_ERROR; if (len<0) sz = (int)strlen((const char*)src); else sz = len; if (sz<=0) return 0; dz = dst->vldsz; if (dz<0) { if (dst->buf!=NULL) dz = (int)strlen((const char*)dst->buf); else dz = 0; } if (dst->bufsz < sz+dz) { Buffer buf; buf.state = dst->state; buf.bufsz = (int)((dst->bufsz+sz+1)*BUFFER_FACT); buf.vldsz = dz; buf.buf = (unsigned char*)malloc(buf.bufsz+1); if (buf.buf==NULL) return JBXL_MALLOC_ERROR; memcpy(buf.buf, dst->buf, dz); buf.buf[dz] = '\0'; free_Buffer(dst); *dst = buf; } memcpy(dst->buf+dz, src, sz); dst->buf[dz+sz] = '\0'; dst->vldsz = sz + dz; return dst->vldsz; } /** int ins_b2Buffer(void* src, Buffer* dst, int len) 任意のバイナリデータsrcを Buffer型変数dstの前に lenバイト挿入する.@n lenが 0未満の場合は, srcは文字列として扱われる. @param src 挿入元の任意データへのポインタ. @param dst 挿入先のBuffer型変数へのポインタ. @param len 挿入するバイト数. @retval 0以上 dstのバッファにコピーされた文字数. @retval JBXL_NULL_EEROR srcまたは dstが NULL @retval JBXL_MALLOC_ERROR メモリの確保に失敗した.何も実行されなかった. */ int ins_b2Buffer(void* src, Buffer* dst, int len) { Buffer tmp = make_Buffer(dst->bufsz+len); int ret = copy_b2Buffer(src, &tmp, len); if (ret<0) { free_Buffer(&tmp); return ret; } ret = cat_Buffer(dst, &tmp); if (ret<0) { free_Buffer(&tmp); return ret; } free_Buffer(dst); *dst = tmp; return dst->vldsz; } /** int copy_i2Buffer(int src, Buffer* dst) 整数 srcを文字列に変換して,dstへ copyする. */ int copy_i2Buffer(int src, Buffer* dst) { char num[LEN_INT]; snprintf(num, LEN_INT-1, "%d", src); return copy_b2Buffer((void*)num, dst, (int)strlen(num)); } /** int cat_i2Buffer(int src, Buffer* dst) 整数 srcを文字列に変換して,dstへ catする. */ int cat_i2Buffer(int src, Buffer* dst) { char num[LEN_INT]; snprintf(num, LEN_INT-1, "%d", src); return cat_b2Buffer((void*)num, dst, (int)strlen(num)); } /** int ins_i2Buffer(int src, Buffer* dst) 整数 srcを文字列に変換して,dstの前に 挿入する. */ int ins_i2Buffer(int src, Buffer* dst) { char num[LEN_INT]; snprintf(num, LEN_INT-1, "%d", src); return ins_b2Buffer((void*)num, dst, (int)strlen(num)); } /** int cmp_Buffer(Buffer src, Buffer dst, int n) バッファ部の比較. Buffer変数 srcと dstのバッファ部分を比較する.@n n<=0 なら 完全一致, n>0 なら 先頭から nバイト比較する. @param src 比較元へのポインタ. @param dst 比較先へのポインタ. @param n 比較文字数. @retval 0 srcと dstは一致している. @retval 1 srcは dstと一致していない. @retval JBXL_NULL_ERROR バッファが NULL @retval JBXL_BUFFER_CMP_ERROR n が vldsz より大きい @attention 文字列データのみ適用.コーディングがベタベタ. */ int cmp_Buffer(Buffer src, Buffer dst, int n) { int i; if (src.buf==NULL || dst.buf==NULL) return JBXL_NULL_ERROR; if (n>src.vldsz || n>dst.vldsz) return JBXL_BUFFER_CMP_ERROR; if (n<=0) { if (src.vldsz!=dst.vldsz) return 1; else n = src.vldsz; } for (i=0; i=0) { ret = make_Buffer(cnt+1); if (ret.buf==NULL) return str; for(i=0; i= str.vldsz) return ret; buf = str.buf; pos = *ptr; while (buf[*ptr]!=CHAR_LF && buf[*ptr]!=CHAR_CR && buf[*ptr]!='\0') (*ptr)++; cnt = *ptr - pos; if (cnt>=0) { ret = make_Buffer(cnt+1); if (ret.buf==NULL) return ret; for(i=0; ibuf[i]!='\0'){ c1 = &(str->buf[i]); c2 = c1 + 1; if(*c1>=0xa1 && *c1<=0xfe){ euc2sjis(c1, c2); i = i + 2; } else i++; } } /* else if (KanjiCode==CODE_EUC) { i = 0; while(str->buf[i]!='\0'){ c1 = (unsigned char) str->buf[i]; c2 = (unsigned char) str->buf[i+1]; if((c1>=0x81 && c1<=0x9f) || (c1>=0xe0 && c1<=0xff)) { sjis2euc(c1, c2); i = i + 2; } else i++; } } */ } /** Buffer randstr_Buffer(int n) ランダムに A-Za-z0-9+/ までの文字を n文字生成する. @param n 出力する文字数. @return ランダムに生成された n文字の文字列(Buffer型). */ Buffer randstr_Buffer(int n) { char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; Buffer pass; int i, sz; pass = make_Buffer(n); if (pass.buf==NULL) return pass; sz = (int)strlen(base); for (i=0; i=0x20 && buf.buf[l*16+i]<=0x7e) { sprintf(wrkbuf, "%c ", buf.buf[l*16+i]); memcpy(str.buf+sp+DUMP_BUFFER_CHAR_START+i*2, wrkbuf, 2); } else { memcpy(str.buf+sp+DUMP_BUFFER_CHAR_START+i*2, ". ", 2); } if (l*16+i>=sz) { memcpy(str.buf+sp+i*3, " ", 3); memcpy(str.buf+sp+DUMP_BUFFER_CHAR_START+i*2, " ", 2); } i++; } memcpy(str.buf+sp+DUMP_BUFFER_DELI_START, " ", 3); str.buf[sp+DUMP_BUFFER_LINE_SIZE-2] = '\r'; str.buf[sp+DUMP_BUFFER_LINE_SIZE-1] = '\n'; } str.vldsz = lineno*DUMP_BUFFER_LINE_SIZE; return str; } /** int recalc_strlen_Buffer(Buffer* buf) Buffer型変数のデータ部を文字列と見なして,その長さを返す.@n vldsz は再計算される. @param[in] buf 操作対象文字列 @param[out] buf @b vldsz 文字列の長さ.再計算される. @return 文字列の長さ. */ int recalc_strlen_Buffer(Buffer* buf) { int len = (int)strlen((char*)buf->buf); buf->vldsz = len; return len; } /** void chomp_Buffer(Buffer* str) 最初の改行コード以降を無視する.@n 最初の改行コードに場所に,'@\0'が代入される. @param[in,out] str 操作対象の文字列(Buffer型). */ void chomp_Buffer(Buffer* str) { int i, len; if (str->buf==NULL) return; len = (int)strlen((const char*)str->buf); for (i=0; ibuf[i]==CHAR_LF || str->buf[i]==CHAR_CR) { str->buf[i] = '\0'; str->vldsz = (int)strlen((const char*)str->buf); return; } } } /** int isText_Buffer(Buffer buf) Buffer型変数 bufのバッファ部がテキストかどうか検査する. @param buf 検査対象の Buffer型変数. @retval TRUE バッファ部はテキストである. @retval FALSE バッファ部はテキストではない. */ int isText_Buffer(Buffer buf) { if (buf.vldsz==(int)strlen((const char*)buf.buf)) return TRUE; return FALSE; } //////////////////////////////////////////////////////////////////////////////////// // File I/O // /** int fgets_Buffer(Buffer* str, FILE* fp) 拡張fgets.文字列の読み込みに使用する.改行コードは削除する.@n strのバッファは予め十分な大きさを確保しておかなければならない. @param str 文字列を読みこむための Buffer型データバッファ. @param fp 文字列を読みこむファイルへのポインタ. @return 読み込んだ文字列の長さ(改行コードを含む). */ int fgets_Buffer(Buffer* str, FILE* fp) { char* p; int n, m; UNUSED(p); memset(str->buf, 0, str->bufsz); p = fgets((char*)str->buf, str->bufsz, fp); m = (int)strlen((const char*)str->buf); n = 0; while(str->buf[n]!=CHAR_LF && str->buf[n]!=CHAR_CR && str->buf[n]!='\0') n++; str->buf[n] = '\0'; str->vldsz = n; // if (KanjiCode!=US) kanji_convert_Buffer(str); return m; } /** int read_lines_Buffer(Buffer* str, FILE* fp) 複数文字列行の読み込み.文字列の読み込みに使用する.@n strのバッファは予め十分な大きさを確保しておかなければならない. @param str 文字列を読みこむための Buffer型データバッファ. @param fp 文字列を読みこむファイルへのポインタ. @return 読み込んだ全データの長さ. */ int read_lines_Buffer(Buffer* str, FILE* fp) { Buffer buf; char* pp; UNUSED(pp); buf = make_Buffer(str->bufsz); if (buf.buf==NULL) return JBXL_BUFFER_MAKE_ERROR; pp = fgets((char*)buf.buf, buf.bufsz, fp); buf.vldsz = (int)strlen((const char*)buf.buf); copy_Buffer(&buf, str); clear_Buffer(&buf); while (!feof(fp)) { pp = fgets((char*)buf.buf, buf.bufsz, fp); buf.vldsz = (int)strlen((const char*)buf.buf); cat_Buffer(&buf, str); clear_Buffer(&buf); } free_Buffer(&buf); return str->vldsz; } /** Buffer read_Buffer_file(const char* fn) ファイル fn の内容を Buffer型変数に読み込む. @param fn ファイル名 @return 読み込んだファイルの内容を保持する Buffer型変数 */ Buffer read_Buffer_file(const char* fn) { int sz; Buffer buf; FILE* fp; buf = init_Buffer(); sz = file_size(fn); if (sz<=0) return buf; fp = fopen(fn, "rb"); if (fp==NULL) return buf; buf = read_Buffer_data(fp, sz); fclose(fp); return buf; } /** Buffer read_Buffer_data(FILE* fp, int sz) ファイルポインタ fp から szバイトをBuffer型変数に読み込む. @param fp ファイルポインタ @param sz 読み込みサイズ @return 読み込んだファイルの内容を保持する Buffer型変数 */ Buffer read_Buffer_data(FILE* fp, int sz) { int cc; Buffer buf; buf = init_Buffer(); if (sz<0) return buf; buf = make_Buffer(sz); if (buf.buf==NULL) return buf; buf.vldsz = sz; cc = (int)fread(buf.buf, buf.vldsz, 1, fp); if (cc!=1) { free_Buffer(&buf); return buf; } return buf; } /** int save_Buffer_file(Buffer buf, char* fn) ファイル fn へ Buffer型変数の buf部を書き込む. @param buf 書き込む Buffer型変数. @param fn ファイル名 @retval TRUE 書き込み成功. @retval FALSE 書き込みに失敗.ファイルの内容は保証されない. */ int save_Buffer_file(Buffer buf, char* fn) { int cc; FILE* fp; fp = fopen(fn, "wb"); if (fp==NULL) return FALSE; cc = (int)fwrite(buf.buf, buf.vldsz, 1, fp); if (cc!=1) return FALSE; fclose(fp); return TRUE; } //////////////////////////////////////////////////////////////////////////////////// // 文字列操作 // /** Buffer erase_bBuffer(Buffer buf, char* bin, int len) buf.buf 中にある bin のデータ(各1Byte,順不同)を削除する. @param buf 操作する Buffer変数 @param bin 削除するデータを格納したメモリへのポインタ @param len binデータの長さ @return 変換した文字列を格納した Buffer変数.要free */ Buffer erase_bBuffer(Buffer buf, char* bin, int len) { int i, j, n; char cc; Buffer res = dup_Buffer(buf); Buffer wrk = make_Buffer(buf.vldsz+1); for (i=0; ibuf==NULL) return FALSE; *buf = read_Buffer_fp(fp); if (buf->buf==NULL) { free_Buffer(key); return FALSE; } return TRUE; } ///////////////////////////////////////////////////////////////////////////////////////////////////// // etc. etc. // // // get_char_ringbuffer() -> pop_char_ringStack() // put_char_ringbuffer() -> push_char_ringStack() // /** char pop_char_ringStack(Buffer* buf) 簡易 char型 ringStack POP */ char pop_char_ringStack(Buffer* buf) { buf->vldsz--; if (buf->vldsz<0) buf->vldsz = buf->bufsz - 1; return (char)buf->buf[buf->vldsz]; } /** void push_char_ringStack(Buffer* buf, char cc) 簡易 char型 ringStack PUSH */ void push_char_ringStack(Buffer* buf, char cc) { buf->buf[buf->vldsz] = (unsigned char)cc; buf->vldsz++; if (buf->vldsz==buf->bufsz) buf->vldsz = 0; return; }