9 #define _CRT_SECURE_NO_WARNINGS
18 #if !defined(_MSC_VER)
23 #if defined(__GNUC_STDC_INLINE__)
24 #elif defined(__GNUC_GNU_INLINE__)
25 #define inline __inline__
26 #elif defined(_MSC_VER)
27 #define inline __inline
33 #define strcasecmp _stricmp
34 #define vsnprintf(buf, len, ...) vsnprintf_s(buf, len, (len)-1, __VA_ARGS__)
66 #define IS_DELIMITER(c) (strchr(RCDelimiters, c) != NULL)
70 #define IS_COMMENT(c) (c == RCCommentChar)
78 static void readNL(FILE *conffp);
103 "no item was specified. numItems = %d", numItems);
114 conffp = fopen(confPath,
"r");
118 "cannot open conf file '%s'. %s",
119 confPath, strerror(errno));
133 for (i = 0; i < numItems; i ++)
137 free(items[i].value.string);
139 free(items[i].defaultValue.string);
151 free(RCRaisedErrors[i].reason);
153 free(RCRaisedErrors);
154 RCRaisedErrors = NULL;
155 RCNumRaisedErrors = 0;
168 length = strlen(str);
169 dup = (
char*)calloc(1, length + 1);
188 while (!feof(conffp))
211 for (i = 0; i < numItems; i ++, item ++)
225 "cannot copy default value of %s. %s",
233 "cannot copy default value of %s. %s",
290 if (c == EOF || c ==
'\n')
308 dest =
findItem(items, numItems, name);
319 "redefinition of '%s'. previous definition is at line %lu.",
338 for (i = 0; i < numItems; i ++, p ++)
340 if (strcasecmp(p->
name, name) == 0)
375 while ((c = fgetc(conffp)) != EOF)
377 if (c ==
'\n' || c ==
'=')
509 if (c ==
'"' || c ==
'\'')
637 if (convertor == NULL)
642 n = strtol(
string, &endptr, 0);
646 "value of %s is not a number. '%c' in '%s'",
647 name, *endptr,
string);
655 "cannot convert constant name '%s' of %s to integer",
676 if (convertor == NULL)
681 r = strtod(
string, &endptr);
685 "value of %s is not a number. '%c' in '%s'",
686 name, *endptr,
string);
694 "cannot convert constant name '%s' of %s to real",
728 if (strcasecmp(
string, boolNames[i].name) == 0)
730 value->
boolean = boolNames[i].value;
766 quote = fgetc(conffp);
767 while ((c = fgetc(conffp)) != quote)
782 string[i++] = (char)c;
823 while ((c = fgetc(conffp)) != EOF)
830 string[i++] = (char)c;
870 while ((c = fgetc(conffp)) != EOF)
891 while ((c = fgetc(conffp)) != EOF)
927 errors = (
RCError*)realloc(RCRaisedErrors,
933 RCRaisedErrors = errors;
942 va_start(ap, format);
static void skipWhitespaces(FILE *conffp)
連続する空白文字を読み捨てます。
RCConvertor convertor
読み込んだ値文字列を数値に変換する関数。
static bool convertStringToReal(const char *name, const char *string, RCConvertor convertor, RCConfValue *value)
文字列を実数値に変換します。
static void readValue(RCConfItem *item, FILE *conffp)
設定ファイルの値を読み込みます。
static bool convertStringToInteger(const char *name, const char *string, RCConvertor convertor, RCConfValue *value)
文字列を整数値に変換します。
static void readExpression(RCConfItem *items, size_t numItems, FILE *conffp)
設定項目の式を読み込みます。
char * RCDuplicateString(const char *str)
指定された文字列を複製します。
bool(* RCConvertor)(const char *name, RCValueType type, const char *string, RCConfValue *value)
設定項目値文字列を数値に変換する関数。
static void readNL(FILE *conffp)
改行文字を読み込みます。
#define IS_COMMENT(c)
指定された文字がコメント開始文字かどうかを真偽値で返します。
static const size_t RCMaxReasonLength
エラーの原因の文字列の最大の長さ。
size_t RCMaxStringLength
設定ファイルから文字列を読み込む際の最大の長さ。
static char * readBareString(FILE *conffp)
コメント開始文字か改行文字が現れるまでを文字列として読み込みます。
static bool convertStringToBool(const char *name, const char *string, RCConfValue *value)
文字列を真偽値に変換します。
#define ELEMENTSOF(ARRAY)
static size_t RCRaisedErrorArrayCapacity
設定ファイル読み込み中に発生したエラーを格納する配列のサイズ。
static void addError(RCErrorNo errorNo, char *format,...)
指定されたエラー番号と文字列を、エラー情報構造体配列に追加します。
#define IS_DELIMITER(c)
指定された文字がデリミタかどうかを真偽値で返します。
RCError * RCRaisedErrors
エラー情報格納配列。
static void readReal(RCConfItem *item, FILE *conffp)
実数値を読み込み、設定項目構造体に登録します。
void RCFreeStringValueInItems(RCConfItem *items, size_t numItems)
指定された設定項目構造体配列の文字列を解放します。
static void readConf(RCConfItem *items, size_t numItems, FILE *conffp)
設定ファイルのストリームから設定を読み込み、指定の構造体に格納します。
static const char RCCommentChar
コメント開始文字。
static void readInteger(RCConfItem *item, FILE *conffp)
整数値を読み込み、設定項目構造体に登録します。
static void setValue(RCConfItem *item, RCConfValue value)
指定された項目に値を設定します。
static void readBool(RCConfItem *item, FILE *conffp)
真偽値を読み込み、設定項目構造体に登録します。
読み込み先の設定項目構造体が指定されませんでした。
static void readString(RCConfItem *item, FILE *conffp)
文字列を読み込み、設定項目構造体に登録します。
static const char *const RCDelimiters
デリミタ文字の集合。
static void initialize(RCConfItem *items, size_t numItems)
設定ファイルを読み込む前の初期化を行います。
static char * readQuotedString(FILE *conffp)
引用符で囲まれた文字列を読み込みます。
char * defaultAsString
デフォルト値の文字列表現。
RCValidator validator
読み込んだ値を検証する関数。
static char * shrinkString(char *str)
文字列が格納されているメモリ領域を文字列の長さで切り詰めます。
static size_t RCReadConfLineNo
設定ファイルを読み込んでいる時の行番号。
bool readconf(RCConfItem *items, size_t numItems, const char *confPath)
指定の設定ファイルから設定を読み込み、指定された構造体配列に格納します。
static char * readName(FILE *conffp)
設定ファイルから項目名を読み込みます。
RCConfValue defaultValue
デフォルト値。
static void skipToEndOfLine(FILE *conffp)
改行文字の直前までを読み捨てます。
void RCFreeRaisedErrors(void)
readconf() による読み込み処理で発生したエラー情報構造体配列を解放します。
size_t RCNumRaisedErrors
エラー情報数。
static RCConfItem * findItem(RCConfItem *items, size_t numItems, char *name)
指定された名前の設定項目を検索します。
size_t RCMaxNameLength
設定ファイルから項目名を読み込む際の最大の長さ。