やってみましたが、こちらでも640x480で
起動しました。
ただ、数値の読み込みにfscanfで%dはしない方が
いいです。入力される値によっては、
バッファーオーバーフロウが発生します。
ユーザに値を変更させるなら、
もう少し分かりやすい方が良いと思うので、
私がやるなら結構しっかり作ると思います。
長いので行を稼ぐ為に可読性無視しています。
こんな感じかな。。。
/* --- config.h --------------------------------------------------------------*/
#ifndef INCLUDE_CONFIG_HEADER
#define INCLUDE_CONFIG_HEADER
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
PARAM_TYPE_END = -1,
PARAM_TYPE_STR = 0,
PARAM_TYPE_INT,
}param_type;
typedef struct confdata{
char* name;
param_type type;
void* ptr;
int is_load;
}confdata_t;
#define PARAM_LIST_END { "", PARAM_TYPE_END, NULL, 0 },
int load_config( const char *, confdata_t * );
#ifdef __cplusplus
}
#endif
#endif//INCLUDE_CONFIG_HEADER
/* --- config.h --------------------------------------------------------------*/
/* --- config.c --------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include "config.h"
#define MAXLINENUM 1024
static int strton( const char *, int * );
static char* cat_needless_str( const char *, char*, unsigned long );
int load_config( const char *filename, confdata_t *secssion_list )
{
FILE *fp;
int read_cnt, success_cnt = 0;
char line[MAXLINENUM],wline[MAXLINENUM],w1[MAXLINENUM],w2[MAXLINENUM];
if ( !filename || !secssion_list ){ return -1; }
fp = fopen( filename ,"r");
if( !fp ){ return -2; }
read_cnt = 0;
while(fgets(line,1020,fp)){
if ( !cat_needless_str( line, wline, sizeof( wline ) - 1 ) ){ continue; }
read_cnt = sscanf(wline,"%1023[^=]=%1023[^\r\n]",w1,w2);
if( 2 != read_cnt ) { continue; }
if ( PARAM_TYPE_END == (secssion_list)->type ) { break; }
(secssion_list)->is_load = 0;
if ( !_stricmp( w1, (secssion_list)->name ) ){
if ( !(secssion_list)->ptr ){
(secssion_list)->is_load = 0;
break;
}
if( PARAM_TYPE_STR == (secssion_list)->type ){
success_cnt++;
strcpy( (char*)(secssion_list)->ptr, w2 );
(secssion_list)->is_load = 1;
} else if( PARAM_TYPE_INT == (secssion_list)->type ) {
if ( !strton( w2, (int*)(secssion_list)->ptr ) ){
success_cnt++;
(secssion_list)->is_load = 1;
}
}
secssion_list++;
}
}
fclose( fp );
return success_cnt;
}
static int strton( const char *numstr, int *pnum )
{
long num = 0;
char *errstr;
if ( strlen(numstr) > 10){ return(1); }
num = strtoul(numstr, &errstr, 0);
if (*errstr){ return(2); }
if ( num > (long)INT_MAX || num < 0) { return(3); }
*pnum = (int)num;
return(0);
}
static char* cat_needless_str( const char * src, char* des, unsigned long dsize )
{
int string_flag = 0;
char *p = des;
while( dsize ){
if ( '\"' == *src ){
if ( !string_flag ){ string_flag = 1; }
else { string_flag = 0; }
}
if ( ' ' == *src || '\f' == *src || '\t'== *src || '\v' == *src ){
if ( !string_flag ){ src++; continue; }
}
if( '/' == *src && '/' == *(src + 1) ){ *des = '\0'; break; }
dsize--;
if (!(*des++ = *src++ )) { break; }
}
while( dsize-- ){ *des++ = '\0'; }
return p;
}
/* --- config.c --------------------------------------------------------------*/
/* --- main.c ----------------------------------------------------------------*/
#include <stdio.h>
#include "config.h"
int WindowSizeW = 0;
int WindowSizeH = 0;
int WindowMode = 0; // 0: Full 1:Win
char WindowName[256] = "Default";
confdata_t window_config[] = {
{ "WindowSizeW", PARAM_TYPE_INT, &WindowSizeW, 0 },
{ "WindowSizeH", PARAM_TYPE_INT, &WindowSizeH, 0 },
{ "WindowMode" , PARAM_TYPE_INT, &WindowMode , 0 },
{ "WindowName" , PARAM_TYPE_STR, WindowName , 0 },
PARAM_LIST_END
};
int main( void )
{
int ret, i;
ret = load_config( "WindowData.txt", window_config );
if ( 0 >= ret ){
printf( "error:%d\n", ret );
return ret;
}
printf( "W=%d H=%d Mode=%d Name=%s\n",WindowSizeW, WindowSizeH, WindowMode, WindowName );
for ( i=0; i<4; i++ ){
printf( "%s Load is %s\n", window_config[i].name, ( window_config[i].is_load ? "Success" : "Faild" ));
}
return 0;
}
/* --- main.c ----------------------------------------------------------------*/
ちょっと脱線しますが、
近年のコンピュータではVGA(640x480x16)が
BIOSレベルで殆どがサポートしています。
最低でもVGAにするのが最適な方法だと思いますが、
320×240にこだわる理由は何でしょうか?