#include #include #include "token.h" #include "common.h" #include "util.h" /* ----------------------------------------------------------------- * =NAME= openSearch - ファイルをオープンする =SYNOPSIS= FILE *openConfigFile(char *filename, char *default_path, char *default_filename) filename - ファイル名 NULL ならば、ファイル名を明示しない。 デフォルトの検索パスでファイルを探す default_path - filename が指定されないとき、検索パス default_filename - filename が指定されないときの検索ファイル名 =RETURN= 0 - 異常終了 その他 - file pointer =DESCRIPTION= 1. filename が指定された場合、そのファイルをオープンする。 オープンできなければ null を返す。 2. filename が指定されなかった場合、 default_path に指定して あるパスから default_filename のファイルを探す。 default_path はパス名を ';' 区切って指定する。 全てのパスを検索してもファイルが開けない場合、 null を返す。 * ----------------------------------------------------------------- */ FILE *openSearch(char *filename, char *default_path, char *default_filename) { FILE *fp; int flag = 0; char *sp = default_path; char path[256]; char buf_filename[512]; if (!filename) { flag = 1; filename = buf_filename; } while (1) { if (flag) { skipSpace(&sp); if (!*sp) break; getTokenStrUntil(&sp, path, 255, ';'); if (*sp == ';') sp++; if (!*path) continue; /* 空のエントリは無視 */ if (path[STRLEN(path) - 1] == '/') { sprintf(buf_filename, "%s%s", path, default_filename); } else { sprintf(buf_filename, "%s/%s", path, default_filename); } } if (!checkOpenFileForRead(filename)) { if (!flag) break; continue; } fp = fopen(filename, "rt"); if (fp) return fp; return 0; } errno = ENOENT; return 0; }