• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision290 (tree)
Zeit2022-02-19 11:52:48
Autorxops-mikan

Log Message

iniファイルクラスの値取得処理を改善

Ändern Zusammenfassung

Diff

--- trunk/datafile.cpp (revision 289)
+++ trunk/datafile.cpp (revision 290)
@@ -1397,20 +1397,22 @@
13971397 //! @param sectionname セクション名(NULL可)
13981398 //! @param keyname キー名
13991399 //! @param defaultvalue デフォルト値
1400-//! @param errorcode エラーコードを取得するポインタ(NULL可)
1401-//! @return 値
1400+//! @param valuestr 値
1401+//! @param strbuflen 最大文字数(-1で無効)
1402+//! @return エラーコード
14021403 //! @attention ファイルが開かれていないか キーが見つからなければ、デフォルト値を返します。
1404+//! @attention 取得した文字列が最大文字数を超えている場合、最大文字数まで切り取ります。
14031405 //! @note エラーコード 1:ファイルが開かれていない、2:値が見つからない
1404-char* INIFileInterface::GetINIFileString(char *sectionname, char *keyname, char *defaultvalue, int *errorcode)
1406+int INIFileInterface::GetINIFileString(char *sectionname, char *keyname, char *defaultvalue, char *valuestr, int strbuflen)
14051407 {
14061408 int state = 0;
1407- char readline[256];
1408- char buf[256];
1409+ char readline[512];
1410+ char buf[512];
14091411
14101412 //ファイルが読み込まれていなければ失敗
14111413 if( inifp == NULL ){
1412- if( errorcode != NULL ){ *errorcode = 1; }
1413- return defaultvalue;
1414+ strcpy(valuestr, defaultvalue);
1415+ return 1;
14141416 }
14151417
14161418 fseek(inifp, 0, SEEK_SET);
@@ -1424,7 +1426,12 @@
14241426 state = 1;
14251427 }
14261428
1427- while( fgets(readline, 256, inifp) != NULL ){
1429+ //データサイズ変数チェック
1430+ if( strbuflen <= -2 ){ strbuflen = 0; }
1431+ if( strbuflen == -1 ){ strbuflen = 512; }
1432+ if( strbuflen > 512 ){ strbuflen = 512; }
1433+
1434+ while( fgets(readline, 512, inifp) != NULL ){
14281435 //コメント行なら無効
14291436 if( readline[0] == ';' ){ continue; }
14301437
@@ -1446,7 +1453,7 @@
14461453 //一文字目が"["なら無効
14471454 if( readline[0] == '[' ){ break; }
14481455
1449- char readline2[256];
1456+ char readline2[512];
14501457 int strcnt = 0;
14511458 int quotationmode = 0;
14521459 char str[64];
@@ -1490,15 +1497,20 @@
14901497 if( strcmp(buf, str) == 0 ){
14911498 state = 1;
14921499
1500+ //データサイズ調整
1501+ strcpy(buf, &(readline2[strlen(str)]));
1502+ buf[strbuflen-1] = '\0';
1503+
14931504 //値を返す
1494- return &(readline2[strlen(str)]);
1505+ strcpy(valuestr, buf);
1506+ return 0;
14951507 }
14961508 }
14971509 }
14981510
14991511 //値が見つからなければエラーを返す
1500- if( errorcode != NULL ){ *errorcode = 2; }
1501- return defaultvalue;
1512+ strcpy(valuestr, defaultvalue);
1513+ return 2;
15021514 }
15031515
15041516 //! @brief int値を取得
@@ -1513,9 +1525,11 @@
15131525 {
15141526 char defaultint[64];
15151527 char buf[64];
1528+ int error;
15161529
15171530 sprintf(defaultint, "%d", defaultvalue);
1518- strcpy(buf, GetINIFileString(sectionname, keyname, defaultint, errorcode));
1531+ error = GetINIFileString(sectionname, keyname, defaultint, buf, 64);
1532+ if( errorcode != NULL ){ *errorcode = error; }
15191533 return atoi(buf);
15201534 }
15211535
@@ -1531,9 +1545,11 @@
15311545 {
15321546 char defaultfloat[64];
15331547 char buf[64];
1548+ int error;
15341549
15351550 sprintf(defaultfloat, "%f", defaultvalue);
1536- strcpy(buf, GetINIFileString(sectionname, keyname, defaultfloat, errorcode));
1551+ error = GetINIFileString(sectionname, keyname, defaultfloat, buf, 64);
1552+ if( errorcode != NULL ){ *errorcode = error; }
15371553 for(int i=strlen(buf)-1; i>0; i--){
15381554 if( buf[i] == 'f' ){ buf[i] = '\0'; }
15391555 if( buf[i] == 'F' ){ buf[i] = '\0'; }
@@ -1553,6 +1569,7 @@
15531569 {
15541570 char defaultbool[64];
15551571 char buf[64];
1572+ int error;
15561573
15571574 if( defaultvalue == false ){
15581575 strcpy(defaultbool, "false");
@@ -1560,7 +1577,8 @@
15601577 else{
15611578 strcpy(defaultbool, "true");
15621579 }
1563- strcpy(buf, GetINIFileString(sectionname, keyname, defaultbool, errorcode));
1580+ error = GetINIFileString(sectionname, keyname, defaultbool, buf, 64);
1581+ if( errorcode != NULL ){ *errorcode = error; }
15641582 for(int j=0; j<=(int)strlen(buf); j++){ if(('A'<=buf[j])&&(buf[j]<='Z')){ buf[j] += 32; } }
15651583 if( strcmp(buf, "false") == 0 ){
15661584 return false;
--- trunk/datafile.h (revision 289)
+++ trunk/datafile.h (revision 290)
@@ -230,7 +230,7 @@
230230 INIFileInterface();
231231 ~INIFileInterface();
232232 bool LoadINIFile(char *fname);
233- char* GetINIFileString(char *sectionname, char *keyname, char *defaultvalue, int *errorcode);
233+ int GetINIFileString(char *sectionname, char *keyname, char *defaultvalue, char *valuestr, int strbuflen);
234234 int GetINIFileInt(char *sectionname, char *keyname, int defaultvalue, int *errorcode);
235235 float GetINIFileFloat(char *sectionname, char *keyname, float defaultvalue, int *errorcode);
236236 bool GetINIFileBool(char *sectionname, char *keyname, bool defaultvalue, int *errorcode);