/* * ファイル名を受け取ってファイルサイズ分のメモリを動的確保し、 * ファイルから読み込んだデータのバッファのポインタを返す関数 * sizeポインタがNULL出ない場合はsizeにはファイルサイズが入ります。 * 返されたバッファは必ずfreeで開放することを忘れないこと */ void* ReadFile(const char *file, int *size) { int file_size, fh; void *buffer = NULL; file_size = FileRead_size(file); if (file_size == -1) { /* ファイルサイズ取得失敗 */ printf("Cannot get file size: %s\n", file); return NULL; } fh = FileRead_open(file, FALSE); if (fh == 0) { /* ファイルオープン失敗 */ printf("Cannot open file: %s\n", file); return NULL; } /* ファイルサイズ分のメモリを動的確保*/ buffer = malloc(file_size); if (buffer == NULL) { /* メモリ確保失敗 */ printf("Cannot allocate memory: %s %dbytes\n", file, file_size); FileRead_close(fh); return NULL; } /* ファイルの データを一括で読み込む*/ if (FileRead_read(buffer, file_size, fh) != file_size) { /* ファイル読み込み失敗*/ printf("Cannot read file: %s\n", file); free(buffer); FileRead_close(fh); return NULL; } if (size != NULL) { *size = file_size; } FileRead_close(fh); return buffer; } /* * ShowSaveDialogの拡張版 * SaveDetailまではShowSaveDialogと同じ * icon0以降は使いたいファイルパス(使わないならNULL)を指定すればOK */ int ShowSaveDialogEx( int mode, void *buf, unsigned int size, const char *GameName, const char *GameTitle, const char *SaveTitle, const char *SaveDetail, const char *icon0, const char *icon1, const char *pic1, const char *snd0 ) { void *icon0_buffer = NULL, *icon1_buffer = NULL, *pic1_buffer = NULL; void *snd0_buffer = NULL; int file_size, result; /* NULLでないなら各リソースを設定 */ file_size = 0; if (icon0 != NULL) { icon0_buffer = ReadFile(icon0, &file_size); } SetSaveResource(DXP_SAVE_RESOURCE_ICON0, icon0_buffer, file_size); file_size = 0; if (icon1 != NULL) { icon1_buffer = ReadFile(icon1, &file_size); } SetSaveResource(DXP_SAVE_RESOURCE_ICON1, icon1_buffer, file_size); file_size = 0; if (pic1 != NULL) { pic1_buffer = ReadFile(pic1, &file_size); } SetSaveResource(DXP_SAVE_RESOURCE_PIC1, pic1_buffer, file_size); file_size = 0; if (snd0 != NULL) { snd0_buffer = ReadFile(snd0, &file_size); } SetSaveResource(DXP_SAVE_RESOURCE_SND0, snd0_buffer, file_size); result = ShowSaveDialog( mode, buf, size, GameName, GameTitle, SaveTitle, SaveDetail ); /* きちんとメモリを開放する */ free(icon0_buffer); free(icon1_buffer); free(pic1_buffer); free(snd0_buffer); return result; }