This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/bin2cpp/bin2cpp.cpp

154 lines
3.7 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "windows.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char _StringBuf[1024];
void Print_Usage(void);
void Write(HANDLE file,const char * format,...);
void Write_Bytes(HANDLE file,const char * bytes,int bytecount);
/*
** This program simply reads in the specified file and creates a cpp and h file
** which define an array of bytes that contain the contents of the input file.
** The cpp and h files will have the same root filename with the extension replaced.
*/
int main(int argc, char* argv[])
{
if (argc != 2) {
Print_Usage();
return 1;
}
/*
** Open the input file
*/
HANDLE inputfile = CreateFile(argv[1],GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (inputfile == INVALID_HANDLE_VALUE) {
printf("Could not open file: %s\n",argv[1]);
Print_Usage();
return 1;
}
DWORD inputsize = GetFileSize(inputfile,NULL);
/*
** Open up the two output files
*/
char drive[_MAX_FNAME];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char cpp_fname[_MAX_DRIVE + _MAX_DIR + _MAX_FNAME + _MAX_EXT];
char h_fname[_MAX_DRIVE + _MAX_DIR + _MAX_FNAME + _MAX_EXT];
_splitpath(argv[1],drive,dir,fname,NULL);
_makepath(cpp_fname,drive,dir,fname,"cpp");
_makepath(h_fname,drive,dir,fname,"h");
HANDLE hfile = CreateFile(h_fname,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (hfile == INVALID_HANDLE_VALUE) {
printf("Could not create file: %s\n",h_fname);
Print_Usage();
return 1;
}
HANDLE cppfile = CreateFile(cpp_fname,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (cppfile == INVALID_HANDLE_VALUE) {
printf("Could not create file: %s\n",h_fname);
Print_Usage();
return 1;
}
/*
** Write the cpp file
*/
Write(cppfile,"\n\nconst unsigned char %s[%d] = \n",fname,inputsize);
Write(cppfile,"{\n");
/*
** Read the file, writing it in text form into the cpp file
*/
const int LINELEN = 16;
char bytes[LINELEN];
DWORD bytesread = 0;
while(bytesread < inputsize) {
DWORD readsize = min(LINELEN,inputsize - bytesread);
DWORD actualread;
ReadFile(inputfile,bytes,readsize,&actualread,NULL);
assert(actualread == readsize);
bytesread += readsize;
Write_Bytes(cppfile,bytes,readsize);
}
/*
** read in remainder
*/
Write(cppfile,"};\n");
/*
** Write the h file
*/
Write(hfile,"\n\nextern const unsigned char %s[%d];\n\n",fname,inputsize);
/*
** Close the files
*/
CloseHandle(inputfile);
CloseHandle(hfile);
CloseHandle(cppfile);
return 0;
}
void Write(HANDLE file,const char * format,...)
{
va_list va;
va_start(va, format);
vsprintf(_StringBuf, format, va);
assert((strlen(_StringBuf) < sizeof(_StringBuf)));
va_end(va);
unsigned long byteswritten;
WriteFile(file,_StringBuf,strlen(_StringBuf),&byteswritten,NULL);
}
void Write_Bytes(HANDLE file,const char * bytes,int bytecount)
{
Write(file,"\t");
for (int i=0;i<bytecount;i++) {
unsigned char val = (unsigned char)bytes[i];
Write(file,"0x%2.2X,",val);
}
Write(file,"\n");
}
void Print_Usage(void)
{
printf("USAGE: bin2h <inputfilename>\n");
}