.INIファイルアクセス


WZ6/マクロ集

#include <windows.h>
#include <text.h>

//#define ENABLESAMPLE

HTEXT newobj iniread(char *filename, char *section, char *keyname, char *defaultvalue);
	// INIファイルから値を読みだす
	// filename: ファイル名をchar*またはHTEXTで指定する。"wz://", "wzcfg://"が含まれていたら展開する。0なら"wzcfg://wzuser.ini"が指定される。
	// section: セクション名をchar*またはHTEXTで指定する。0なら"Settings"が指定される。
	// keyname: キー名を指定する。
	// defaultvalue: キー名に対応した値がなかった場合の文字列を文字列定数またはHTEXTでしていする。0を指定すると0が戻り値になる。
	// 戻り値:取得した値がHTEXTで返る。エラーが発生した場合と値が存在せずデフォルト値に0が指定された場合は0が返る。

BOOL iniwrite(char *filename, char *section, char *keyname, char *value);
	// INIファイルに値を書き込む
	// filename: ファイル名をchar*またはHTEXTで指定する。"wz://", "wzcfg://"が含まれていたら展開する。0なら"wzcfg://wzuser.ini"が指定される。
	// section: セクション名をchar*またはHTEXTで指定する。0なら"Settings"が指定される。
	// keyname: キー名を指定する。
	// defaultvalue: キー名に対応した値がなかった場合の文字列を文字列定数またはHTEXTでしていする。0を指定すると0が戻り値になる。
	// 戻り値:取得した値がHTEXTで返る。エラーが発生した場合と値が存在せずデフォルト値に0が指定された場合は0が返る。

int inireadint(char *filename, char *section, char *keyname, int defaultvalue);
	// INIファイルから数値を読みだす

BOOL iniwriteint(char *filename, char *section, char *keyname, int value);
	// INIファイルに数値を書き込む

HTEXT newobj inireadsection(char *filename, char *section);
	// セクションを読み込む

BOOL iniwriteint(char *filename, char *section, char *keyname, int value)
{
	char a[30]; itoa(value, a, 10);
	return iniwrite(filename, section, keyname, a);
}

#ifdef ENABLESAMPLE
inisample {
	title: INIファイルアクセスのサンプルコード

	HTEXT text = getfocus();

	printf(".INIファイルサンプル\n");

	// filename="wzcfg://wzuser.ini"
	// section="Settings"
	// で読み書き
	HTEXT now = textprintf("%d", GetTickCount);
	iniwrite(0, 0, "now", now) ;
	now = iniread(0, 0, "now", 0);
	if(now) printf("now=%s\n", now);

	printf("..通常のファイルにアクセス\n");
	HTEXT fn = textprintf("%s.ini", __FILE__); // マクロ固有の設定

	iniwrite(fn, "tool", "path", \"c:\xxx\yyy\zzz");
	HTEXT path = iniread(fn, "tool", "path", \"C:\Program Files\xxx\yyy");
	printf("path=%s\n", path);

	iniwrite(fn, "tool", "path", 0); // 値を削除
	path = iniread(fn, "tool", "path", \"C:\Program Files\xxx\yyy"); // デフォルト値が返るはず
	printf("path=%s\n", path);

	printf("..int値のアクセス\n");

	iniwrite(0, 0, "value", "312");
	int v = inireadint(0, 0, "value", -9999);
	printf("v=%d\n", v);

	iniwrite(0, 0, "value", "abc");
	v = inireadint(0, 0, "value", -9999);
	printf("v=%d\n", v);

	iniwrite(0, 0, "value", 0); // 値を削除

	v = inireadint(0, 0, "value", -9999);
	printf("v=%d\n", v);

	int passcount = inireadint(0, 0, "passcount", 0);
	iniwriteint(0, 0, "passcount", passcount + 1);
	printf("passcount=%d\n", passcount);

	printf("..セクションの内容を表示\n");
	HTEXT sec = inireadsection(0, 0);
	printf("section=[%s]\n", getdata(sec));
}
#endif // ENABLESAMPLE

// implementation

static HTEXT newobj iniexpandfn(char *filename)
{
	wchar *w = wdupfn(filename);
	char *s = strdupW(w);
	HTEXT fn = dup(s);
	free(w); free(s);
	return (tosjis(fn, detectkc(fn))) ? fn : 0;
}

HTEXT newobj iniread(char *filename, char *section, char *keyname, char *defaultvalue)
{
	HTEXT fn = iniexpandfn(dupstr(filename ? filename : "wzcfg://wzuser.ini"));
	if(!fn) return 0;
	if(keyname == 0) return 0;
	if(istext(keyname)) keyname = getdata(keyname);
	HTEXT sec = dupstr(section ? section : "Settings");
	HTEXT iv = textprintf("wz6inbaridostl:%ds/123", GetTickCount());
	HTEXT dv = defaultvalue ?  iv : dupstr(defaultvalue);

	char buf[4096];
	if(!GetPrivateProfileStringA(getdata(sec), keyname,  getdata(dv), buf, sizeof(buf),  getdata(fn)))
		return 0;
	return strcmp(buf, iv) == 0 ? dupstr(defaultvalue) : dupstr(buf);
}

int inireadint(char *filename, char *section, char *keyname, int defaultvalue)
{
	char a[30];
	HTEXT s = iniread(filename, section, keyname, itoa(defaultvalue, a, 10));
	char *p = getdata(s);
	strupr(p);
	if(!strcmp(p, "ON") || !strcmp(p, "TRUE")) return 1;
	if(!strcmp(p, "OFF") || !strcmp(p, "FALSE")) return 0;

	double d;
	if(atopf(p, &d)) return d; else return defaultvalue;
}

BOOL iniwrite(char *filename, char *section, char *keyname, char *value)
{
	HTEXT fn = iniexpandfn(dupstr(filename ? filename : "wzcfg://wzuser.ini"));
	if(!fn) return 0;
	if(keyname == 0) return 0;
	if(istext(keyname)) keyname = getdata(keyname);
	HTEXT sec = dupstr(section ? section : "Settings");
	HTEXT v = value ? dupstr(value) : 0;
	return WritePrivateProfileStringA(getdata(sec), keyname, value ? getdata(v) : 0, getdata(fn));
}

HTEXT newobj inireadsection(char *filename, char *section)
{
	HTEXT fn = iniexpandfn(dupstr(filename ? filename : "wzcfg://wzuser.ini"));
	if(!fn) return 0;
	int bufsize = 64*1024;
	char *buf = malloc(bufsize);
	HTEXT sec = dupstr(section ? section : "Settings");

	if(!GetPrivateProfileSectionA(getdata(sec), buf, bufsize, getdata(fn))) { free(buf); return 0; }

	HTEXT ret = new();
	char *p = buf;
	do{ addf(ret, "%s\n", p); while(*p++) ; } while(*p);
	free(buf);
	return ret;
}

BOOL iniwriteint(char *filename, char *section, char *keyname, int value)
{
	char a[30]; itoa(value, a, 10);
	return iniwrite(filename, section, keyname, a);
}