mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-22 10:20:26 +01:00
Fix for Ecc failing on empty files
This commit is contained in:
parent
c9fe415f2c
commit
cfefaf581a
|
@ -227,6 +227,104 @@ void ReplaceFile(const char *strOld, const char *strNew)
|
||||||
remove(strOld);
|
remove(strOld);
|
||||||
rename(strNew, strOld);
|
rename(strNew, strOld);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ESStatus
|
||||||
|
{
|
||||||
|
/* Appears to be non-empty, ready to parse. */
|
||||||
|
Good,
|
||||||
|
/* Appears to be empty, ignore it. */
|
||||||
|
Empty,
|
||||||
|
/* Error occured during status check. */
|
||||||
|
Error,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Determine whether or not our target ES file is indeed valid input. */
|
||||||
|
ESStatus GetESStatus(char *filename)
|
||||||
|
{
|
||||||
|
ESStatus result = ESStatus::Good;
|
||||||
|
|
||||||
|
// Read a temporary buffer of the entire file contents
|
||||||
|
fseek(_fInput, 0, SEEK_END);
|
||||||
|
size_t length = ftell(_fInput);
|
||||||
|
char* temporaryBuffer = (char*)malloc(length);
|
||||||
|
fseek(_fInput, 0, SEEK_SET);
|
||||||
|
fread(temporaryBuffer, length, 1, _fInput);
|
||||||
|
fclose(_fInput);
|
||||||
|
|
||||||
|
// First, let's remove line comments
|
||||||
|
char *commentBegin = NULL;
|
||||||
|
while (commentBegin = strstr(temporaryBuffer, "//"))
|
||||||
|
{
|
||||||
|
size_t commentLength = length;
|
||||||
|
|
||||||
|
char* lineEnding = strstr(commentBegin, "\n");
|
||||||
|
if (lineEnding)
|
||||||
|
commentLength = (size_t)(lineEnding) - (size_t)commentBegin;
|
||||||
|
|
||||||
|
memset(commentBegin, 0x20, commentLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then block comments
|
||||||
|
commentBegin = NULL;
|
||||||
|
while (commentBegin = strstr(temporaryBuffer, "/*"))
|
||||||
|
{
|
||||||
|
size_t commentLength = length;
|
||||||
|
|
||||||
|
char* commentEnd = strstr(commentBegin, "*/");
|
||||||
|
if (commentEnd)
|
||||||
|
commentLength = (size_t)(commentEnd + 3) - (size_t)commentBegin;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = ESStatus::Error;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(commentBegin, 0x20, commentLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we return here, it was because of unbalanced block comments
|
||||||
|
if (result != ESStatus::Good)
|
||||||
|
{
|
||||||
|
free(temporaryBuffer);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we just loop through the buffer until we find something that's not 0x20 or \n
|
||||||
|
result = ESStatus::Empty;
|
||||||
|
for (size_t iteration = 0; iteration < length; iteration++)
|
||||||
|
if (temporaryBuffer[iteration] != 0x20 && temporaryBuffer[iteration] != '\n')
|
||||||
|
{
|
||||||
|
size_t checkLength = length;
|
||||||
|
char* checkStart = &temporaryBuffer[iteration];
|
||||||
|
|
||||||
|
char* lineEnding = strstr(checkStart, "\n");
|
||||||
|
if (lineEnding)
|
||||||
|
checkLength = (size_t)(lineEnding) - (size_t)checkStart;
|
||||||
|
|
||||||
|
// Loop through and use isdigit to check all the digits
|
||||||
|
checkStart[checkLength + 1] = 0x00;
|
||||||
|
|
||||||
|
for (int digit = 0; digit < strlen(checkStart); digit++)
|
||||||
|
if (checkStart[digit] != 0x20 && checkStart[digit] != '\n' && isdigit(checkStart[digit]))
|
||||||
|
result = ESStatus::Good;
|
||||||
|
else if (checkStart[digit] != 0x20 && checkStart[digit] != '\n')
|
||||||
|
{
|
||||||
|
// If this occurs, then the first non-whitespace line we read wasn't a number.
|
||||||
|
result = ESStatus::Error;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
free(temporaryBuffer);
|
||||||
|
if (result == ESStatus::Good)
|
||||||
|
_fInput = FOpen(filename, "r");
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/* Replace a file with a new file if they are different.
|
/* Replace a file with a new file if they are different.
|
||||||
* Used to keep .h files from constantly changing when you change the implementation.
|
* Used to keep .h files from constantly changing when you change the implementation.
|
||||||
*/
|
*/
|
||||||
|
@ -283,6 +381,18 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
// open the input file
|
// open the input file
|
||||||
_fInput = FOpen(argv[1], "r");
|
_fInput = FOpen(argv[1], "r");
|
||||||
|
|
||||||
|
// Make sure we're loading a valid ES file
|
||||||
|
ESStatus status = GetESStatus(argv[1]);
|
||||||
|
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case ESStatus::Empty:
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
case ESStatus::Error:
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
//printf("%s\n", argv[1]);
|
//printf("%s\n", argv[1]);
|
||||||
// open all the output files
|
// open all the output files
|
||||||
char *strImplementation = ChangeFileNameExtension(argv[1], ".cpp_tmp");
|
char *strImplementation = ChangeFileNameExtension(argv[1], ".cpp_tmp");
|
||||||
|
|
|
@ -13,6 +13,7 @@ You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -27,4 +28,3 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#define _fullpath(x, y, z) realpath(y, x)
|
#define _fullpath(x, y, z) realpath(y, x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user