/* start の位置から、次の カンマ または NULL までを out で指定された場所に書き込む。但し、maxbyteで 指定したサイズ以上は書き込まない。 */ char *get_camma_str( char *start, int maxbyte, char *out ) { char *next_ptr; char wk; int len; for( next_ptr = start; ; next_ptr++ ) { wk = *next_ptr; if ( wk == ',' || wk == 0x0d || wk == 0x0a || wk == '\0' ) break; } len = next_ptr - start; if ( len < maxbyte ) { memcpy( out, start, len ); out[len] = '\0'; }else{ memcpy( out, start, maxbyte - 1 ); out[maxbyte - 1] = '\0'; } return( wk ? next_ptr + 1 : next_ptr ); } /* 指定されたスコアがどの位置に入るかを求める処理 正の数なら登録できる位置(0〜HISCORE_MAX-1)で、負の値なら登録不可能。 */ int search_pofscore( SCORE_INFO *psc ) { int iti; /* 挿入位置を探す */ for( iti = 0; iti < hscore.count; iti++ ) { if ( strcmp( hscore.info[iti].score, psc->score ) > 0 ) { return( iti ); } } return( (iti < HISCORE_MAX) ? iti : -1 ); } /* ソートしつつハイスコアデータを変数に記録する処理 */ void insert_hi_score( SCORE_INFO *psc ) { int iti; int wk; /* 挿入位置を探し、無ければ何もせず戻る */ if ( (iti = search_pofscore( psc )) < 0 ) return; /* 挿入位置より後ろを1つずらす */ for( wk = HISCORE_MAX - 1; wk > iti; wk-- ) { hscore.info[wk] = hscore.info[wk - 1]; } /* 挿入位置への書き込み */ hscore.info[iti] = *psc; /* 登録数をカウントアップ */ if ( hscore.count < HISCORE_MAX ) { hscore.count ++; } } /* ハイスコアファイルから値を読み出す処理 */ int read_hi_score( char *filename ) { FILE *fp; int tcnt; char wkbuf[80]; char *wkptr; char *wkend; int c; char *cmaptr; SCORE_INFO sc; /* 構造体をヌルクリア */ memset( &hscore, 0, sizeof(hscore) ); /* ボリューム名を得る */ if ( ! GetAplVolumeName( GetMyAplName(), (void *)wkbuf ) ) return( 0 ); /* ボリューム名付きのファイル名を作成 */ strcat( wkbuf, filename ); /* ファイルが読み出せなければ無いのでそのまま戻る */ if ( (fp = fopen( wkbuf, "rb" )) == NULL ) { return( 0 ); } while( ! feof(fp) ) { /* 1行読み込む(80文字はないという前提) */ wkptr = (char*)wkbuf; wkend = (char*)&wkbuf[sizeof(wkbuf) - 1]; while( (wkptr < wkend) && ((c = fgetc(fp)) != EOF) && (c != 0x0a) ) { if ( c == 0x0d ) { continue; /* CR は無視 */ } *wkptr++ = c; } *wkptr = '\0'; /* 行頭が # や ; か空行ならスキップする */ switch( wkbuf[0] ) { case '#': case ';': case ' ': case ',': case '\0': continue; default: break; } /* 値を読み込む */ cmaptr = wkbuf; cmaptr = get_camma_str( cmaptr, sizeof(sc.score), (PTR)sc.score ); cmaptr = get_camma_str( cmaptr, sizeof(sc.clrdate), (PTR)sc.clrdate ); cmaptr = get_camma_str( cmaptr, sizeof(sc.clrtime), (PTR)sc.clrtime ); strncpy( sc.name, cmaptr, sizeof(sc.name) ); sc.name[ sizeof(sc.name) - 1 ] = '\0'; /* ソートしつつ値を書き込む(必要個数以上は入らないから安心) */ insert_hi_score( &sc ); } /* ファイルを忘れずに閉じる事 */ fclose( fp ); return( hscore.count ); } /* ハイスコアファイルに値を保存する処理 */ int write_hi_score( char *filename ) { FILE *fp; char wkbuf[80]; char *wkend; int c; /* ボリューム名を得る */ if ( ! GetAplVolumeName( GetMyAplName(), (void *)wkbuf ) ) return( 0 ); /* ボリューム名付きのファイル名を作成 */ strcat( wkbuf, filename ); /* ファイルにハイスコア情報を書き込む */ if ( (fp = fopen( wkbuf, "wb" )) != NULL ) { /* ヘッダをコメントとして書き込む */ sprintf( wkbuf, "#四川省ハイスコアファイル\r\n#登録件数=%d\r\n", hscore.count ); fwrite( wkbuf, 1, strlen(wkbuf), fp ); for( c = 0; c < hscore.count; c++ ) { /* 書き込み用文字列の作成 */ sprintf( wkbuf, "%s,%s,%s,%s\r\n", hscore.info[c].score, hscore.info[c].clrdate, hscore.info[c].clrtime, hscore.info[c].name ); /* とりあえず書き込み失敗は無視 */ fwrite( wkbuf, 1, strlen(wkbuf), fp ); } /* ファイルを忘れずに閉じる事 */ fclose( fp ); } return( 0 ); }