diff options
Diffstat (limited to '')
| -rw-r--r-- | project/dclib/lib-bmg.c | 134 |
1 files changed, 92 insertions, 42 deletions
diff --git a/project/dclib/lib-bmg.c b/project/dclib/lib-bmg.c index 0540243..9b7f5fd 100644 --- a/project/dclib/lib-bmg.c +++ b/project/dclib/lib-bmg.c @@ -3664,10 +3664,38 @@ enumError SaveRawBMG SetFileAttrib(&F.fatt,&bmg->fatt,0); if ( fwrite(bmg->raw_data,1,bmg->raw_data_size,F.f) != bmg->raw_data_size ) - FILEERROR1(&F,ERR_WRITE_FAILED,"Write failed: %s\n",fname); + err = FILEERROR1(&F,ERR_WRITE_FAILED,"Write failed: %s\n",fname); return ResetFile(&F,set_time); } +/////////////////////////////////////////////////////////////////////////////// + +enumError SaveRawFileBMG +( + bmg_t * bmg, // pointer to valid bmg + FILE * f, // valid output file + ccp fname // NULL or filename for error messages +) +{ + DASSERT(bmg); + + + //--- create raw data + + enumError err = CreateRawBMG(bmg); + if (err) + return err; + DASSERT(bmg->raw_data); + DASSERT(bmg->raw_data_size); + + + //--- write to file + + if ( fwrite(bmg->raw_data,1,bmg->raw_data_size,f) != bmg->raw_data_size ) + err = ERROR1(ERR_WRITE_FAILED,"Write failed: %s\n",fname?fname:"?"); + return err; +} + // /////////////////////////////////////////////////////////////////////////////// /////////////// SaveTextBMG() /////////////// @@ -3741,15 +3769,16 @@ char * PrintAttribBMG /////////////////////////////////////////////////////////////////////////////// static void print_message - ( File_t *F, bmg_t *bmg, const bmg_item_t *bi, ccp mid_name ) + ( FILE *f, bmg_t *bmg, const bmg_item_t *bi, ccp mid_name ) { + DASSERT(f); DASSERT(bmg); DASSERT(bi); if ( bmg->active_cond != bi->cond ) { bmg->active_cond = bi->cond; - fprintf(F->f,"@? %x\n",bmg->active_cond); + fprintf(f,"@? %x\n",bmg->active_cond); } ccp slot; @@ -3779,14 +3808,14 @@ static void print_message if ( bmg->attrib_used == 4 ) { // classic, compatible with all versions - fprintf(F->f,"%s\t~%s 0x%08x\r\n",mid_name,slot,be32(bi->attrib)); + fprintf(f,"%s\t~%s 0x%08x\r\n",mid_name,slot,be32(bi->attrib)); } else { // use new attrib vector PrintAttribBMG( attrib, sizeof(attrib), bi->attrib, bi->attrib_used, bmg->attrib, true ); - fprintf(F->f,"%s\t~%s %s\r\n",mid_name,slot,attrib); + fprintf(f,"%s\t~%s %s\r\n",mid_name,slot,attrib); } } @@ -3806,10 +3835,10 @@ static void print_message snprintf(attrib,sizeof(attrib),"%s\t",mid_name); if ( bi->text == bmg_null_entry ) - fprintf(F->f,"%s/\r\n",attrib); + fprintf(f,"%s/\r\n",attrib); else if ( bi->text ) { - fputs(attrib,F->f); + fputs(attrib,f); const int use_colors = opt_bmg_colors != 1 ? opt_bmg_colors : bmg->use_color_names > 0; @@ -3870,7 +3899,7 @@ static void print_message if ( good_break && good_break < end - 8 ) ptr = good_break; - fprintf(F->f,"%s %.*s\r\n", sep, (int)(ptr-start), start ); + fprintf(f,"%s %.*s\r\n", sep, (int)(ptr-start), start ); sep = "\t+"; } while ( ptr < end ); @@ -3885,17 +3914,47 @@ enumError SaveTextBMG ccp fname, // filename of destination FileMode_t fmode, // create-file mode bool set_time, // true: set time stamps - bool force_numeric, // true: force numric MIDs + bool force_numeric, // true: force numeric MIDs uint brief_count // >0: suppress syntax info // >1: suppress all comments // >2: suppress '#BMG' magic ) { - // use DOS/Windows line format -> unix can handle it ;) - DASSERT(bmg); DASSERT(fname); PRINT("SaveTextBMG(%s,%d)\n",fname,set_time); + + //--- open file + + File_t F; + enumError err = CreateFile(&F,true,fname,fmode); + if ( err > ERR_WARNING || !F.f ) + return err; + SetFileAttrib(&F.fatt,&bmg->fatt,0); + + err = SaveTextFileBMG(bmg,F.f,fname,force_numeric,brief_count); + + ResetFile(&F,set_time); + return err; +} + +// +/////////////////////////////////////////////////////////////////////////////// + +enumError SaveTextFileBMG +( + bmg_t * bmg, // pointer to valid bmg + FILE * f, // valid output file + ccp fname, // NULL or filename for error messages + bool force_numeric, // true: force numeric MIDs + uint brief_count // >0: suppress syntax info + // >1: suppress all comments + // >2: suppress '#BMG' magic +) +{ + // use DOS/Windows line format -> unix can handle it ;) + + DASSERT(bmg); bmg->active_cond = 0; enum { BRIEF_ALL, BRIEF_NO_SYNTAX, BRIEF_NO_COMMENT, BRIEF_NO_MAGIC }; @@ -3970,19 +4029,11 @@ enumError SaveTextBMG }; - //--- open file - - File_t F; - enumError err = CreateFile(&F,true,fname,fmode); - if ( err > ERR_WARNING || !F.f ) - return err; - SetFileAttrib(&F.fatt,&bmg->fatt,0); - const bool print_full = brief_count == BRIEF_ALL && !opt_bmg_export; if (print_full) - fwrite(text_head,1,sizeof(text_head)-1,F.f); + fwrite(text_head,1,sizeof(text_head)-1,f); else if ( brief_count < BRIEF_NO_MAGIC ) - fprintf(F.f,"%s\r\n\r\n",BMG_TEXT_MAGIC); + fprintf(f,"%s\r\n\r\n",BMG_TEXT_MAGIC); HavePredifinedSlots(bmg); bmg->legacy = bmg->legacy != 0; @@ -4006,7 +4057,7 @@ enumError SaveTextBMG PrintAttribBMG(abuf,sizeof(abuf),bmg->attrib,bmg->attrib_used,0,true); if (print_full) { - fprintf(F.f,text_param, + fprintf(f,text_param, param_announce, endian->is_le, bmg->legacy, encoding, bmg->have_mid, bmg->inf_size, abuf, @@ -4014,7 +4065,7 @@ enumError SaveTextBMG param_announce = ""; } else if ( brief_count < BRIEF_NO_MAGIC ) - fprintf(F.f,"@ENDIAN = %u\r\n" + fprintf(f,"@ENDIAN = %u\r\n" "@LEGACY = %u\r\n" "@ENCODING = %u\r\n" "@BMG-MID = %u\r\n" @@ -4035,12 +4086,12 @@ enumError SaveTextBMG ) { if (print_full) - fprintf(F.f,unknown_param, + fprintf(f,unknown_param, param_announce, bmg->unknown_inf_0c, bmg->unknown_mid_0a, bmg->unknown_mid_0c ); else if ( brief_count < BRIEF_NO_MAGIC ) - fprintf(F.f,"@UNKNOWN-INF32-0C = %#x\r\n" + fprintf(f,"@UNKNOWN-INF32-0C = %#x\r\n" "@UNKNOWN-MID16-0A = %#x\r\n" "@UNKNOWN-MID32-0C = %#x\r\n" "\r\n", @@ -4087,14 +4138,14 @@ enumError SaveTextBMG if (!last_cup) { intro = intro_other; - fprintf(F.f,"\r\n#--- standard track names\r\n\r\n"); + fprintf(f,"\r\n#--- standard track names\r\n\r\n"); } else - fputs("\r\n",F.f); + fputs("\r\n",f); last_cup = cup; } snprintf(mid_name,sizeof(mid_name), " T%c%c", cup, idx % 4 + '1' ); - print_message(&F,bmg,bi1,mid_name); + print_message(f,bmg,bi1,mid_name); already_printed[ bi1->mid - MID__VIP_BEG ] = true; already_printed[ bi2->mid - MID__VIP_BEG ] = true; @@ -4137,14 +4188,14 @@ enumError SaveTextBMG if (!last_cup) { intro = intro_other; - fprintf(F.f,"\r\n#--- battle track names\r\n\r\n"); + fprintf(f,"\r\n#--- battle track names\r\n\r\n"); } else - fputs("\r\n",F.f); + fputs("\r\n",f); last_cup = cup; } snprintf(mid_name,sizeof(mid_name), " U%c%c", cup, idx % 5 + '1' ); - print_message(&F,bmg,bi1,mid_name); + print_message(f,bmg,bi1,mid_name); already_printed[ bi1->mid - MID__VIP_BEG ] = true; already_printed[ bi2->mid - MID__VIP_BEG ] = true; @@ -4175,14 +4226,14 @@ enumError SaveTextBMG if ( brief_count < BRIEF_NO_COMMENT ) { intro = intro_other; - fprintf(F.f,"\r\n#--- online chat\r\n\r\n"); + fprintf(f,"\r\n#--- online chat\r\n\r\n"); } for ( ; bi1 < bi1end; bi1++ ) { DASSERT( bi1->mid >= MID_CHAT_BEG && bi1->mid <= MID_CHAT_END ); snprintf(mid_name,sizeof(mid_name)," M%02u",bi1->mid-MID_CHAT_BEG+1); - print_message(&F,bmg,bi1,mid_name); + print_message(f,bmg,bi1,mid_name); already_printed[bi1->mid-MID__VIP_BEG] = true; } } @@ -4282,22 +4333,22 @@ enumError SaveTextBMG while ( sep->mid && mid >= sep->mid ) sep++; if ( sep > sep_tab+1 && sep[-2].mid == mid && sep[-2].info ) - fprintf(F.f,"\r\n#--- [%x] %s\r\n", mid, sep[-2].info ); + fprintf(f,"\r\n#--- [%x] %s\r\n", mid, sep[-2].info ); else if ( sep[-1].info ) - fprintf(F.f,"\r\n#--- [%x:%x] %s\r\n", + fprintf(f,"\r\n#--- [%x:%x] %s\r\n", sep[-1].mid, sep->mid-1, sep[-1].info ); else - fputs("\r\n",F.f); + fputs("\r\n",f); intro = 0; } if ( brief_count < BRIEF_NO_COMMENT && intro ) { - fputs(intro,F.f); + fputs(intro,f); intro = 0; } snprintf(mid_name,sizeof(mid_name),"%6x",bi->mid); - print_message(&F,bmg,bi,mid_name); + print_message(f,bmg,bi,mid_name); } } @@ -4309,7 +4360,7 @@ enumError SaveTextBMG XDump_t xd; InitializeXDump(&xd); SetupXDump(&xd,XDUMPC_DUMP); - xd.f = F.f; + xd.f = f; xd.indent = 1; xd.prefix = "@X"; xd.eol = "\r\n"; @@ -4326,7 +4377,7 @@ enumError SaveTextBMG raw->total_size, raw->total_size ); char name[20]; - fprintf(F.f,"\r\n#\f\r\n#--------------------------------------" + fprintf(f,"\r\n#\f\r\n#--------------------------------------" "----------------------------------------\r\n\r\n" "@SECTION \"%s\"\r\n\r\n", PrintEscapedString( name, sizeof(name), @@ -4343,8 +4394,7 @@ enumError SaveTextBMG //--- terminate if ( brief_count < 2 ) - fputs("\r\n",F.f); - ResetFile(&F,set_time); + fputs("\r\n",f); return ERR_OK; } |
