/* Copyright (C)1999 ASH multimedia lab. (http://ash.jp/) */ #include #include #include #include "libfile.h" /************************/ /* ファイルチェック処理 */ /************************/ /* 通常ファイル判定 */ int isfile(path) char *path; /* パス名 */ { struct stat filestat; if (stat(path, &filestat)) {return(0);} if (filestat.st_mode & S_IFREG) {return(1);} return(0); } /* ディレクトリ判定 */ int isdir(path) char *path; /* パス名 */ { struct stat filestat; if (stat(path, &filestat)) {return(0);} if (filestat.st_mode & S_IFDIR) {return(1);} return(0); } /******************************************/ /* 先読みバッファ付きファイルアクセス関数 */ /******************************************/ /* バッファの初期処理 */ char *open_buf(cbuf, size, psize) struct tbuf *cbuf; /* 読込みバッファ */ int size; /* 読込みバッファサイズ */ int psize; /* 先読みバッファサイズ */ { cbuf->len = 0; /* 読込みサイズ */ cbuf->size = size; /* 読込みバッファサイズ */ cbuf->psize = psize; /* 先読みバッファサイズ */ cbuf->max = cbuf->size + cbuf->psize; /* 領域サイズ */ cbuf->dat = (char *)malloc(cbuf->max + 1); /* データポインタ */ return(cbuf->dat); } /* バッファの読込み処理 */ int get_buf(cbuf, fp) struct tbuf *cbuf; FILE *fp; { int len; if (cbuf->len == 0) { /* 最初の読込み */ cbuf->len = fread(cbuf->dat, 1, cbuf->max, fp); } else { if (cbuf->len < cbuf->max) { /* End Of File */ if (cbuf->len <= cbuf->size) { cbuf->len = 0; } else { /* 最後の読込み */ cbuf->len = cbuf->len - cbuf->size; memcpy(cbuf->dat, &cbuf->dat[cbuf->size], cbuf->len); } } else { /* 継続読込み */ memcpy(cbuf->dat, &(cbuf->dat[cbuf->size]), cbuf->psize); len = fread(&(cbuf->dat[cbuf->psize]), 1, cbuf->size, fp); cbuf->len = cbuf->psize + len; } } cbuf->dat[cbuf->len] = '\0'; if (cbuf->len > cbuf->size) {len = cbuf->size;} else {len = cbuf->len;} return(len); } /* バッファの終了処理 */ void close_buf(cbuf) struct tbuf *cbuf; /* 読込みバッファ */ { free(cbuf->dat); }