Address #391. Tested on macOS and Win10.

- Add a check upon opening a file for validity of the file.
- Add a new message to indicate that the path is not a file.
This commit is contained in:
Jim Derry 2017-05-07 17:04:53 -04:00
parent 6f2fb6e0e7
commit ce105dcf09
7 changed files with 22 additions and 10 deletions

View File

@ -101,6 +101,7 @@ extern "C" {
*/
#define FOREACH_MSG_MISC(FN) \
/** File can't be opened */ FN(FILE_CANT_OPEN) \
/** Not a file */ FN(FILE_NOT_FILE) \
/** line %d column %d */ FN(LINE_COLUMN_STRING) \
/** Document content looks like %s */ FN(STRING_CONTENT_LOOKS) \
/** discarding */ FN(STRING_DISCARDING) \

View File

@ -808,7 +808,7 @@ int TY_(ParseConfigFileEnc)( TidyDocImpl* doc, ctmbstr file, ctmbstr charenc )
if ( fin == NULL || enc < 0 )
{
TY_(FileError)( doc, fname, TidyConfig );
TY_(FileError)( doc, fname, TidyConfig, FILE_CANT_OPEN );
return -1;
}
else

View File

@ -1545,6 +1545,7 @@ static languageDefinition language_en = { whichPluralForm_en, {
** @rename enum generator FOREACH_MSG_MISC
********************************************/
{ FILE_CANT_OPEN, 0, "Can't open \"%s\"\n" },
{ FILE_NOT_FILE, 0, "\"%s\" is not a file!\n" },
{ LINE_COLUMN_STRING, 0, "line %d column %d - " },
{ STRING_CONTENT_LOOKS, 0, "Document content looks like %s" },
{/* For example, "discarding invalid UTF-16 surrogate pair" */

View File

@ -326,7 +326,7 @@ int TY_(DocParseFileWithMappedFile)( TidyDocImpl* doc, ctmbstr filnam ) {
TY_(freeStreamIn)( in );
}
else /* Error message! */
TY_(FileError)( doc, filnam, TidyError );
TY_(FileError)( doc, filnam, TidyError, FILE_CANT_OPEN );
return status;
}

View File

@ -459,9 +459,9 @@ void TY_(ReportFatal)( TidyDocImpl* doc, Node *element, Node *node, uint code)
*********************************************************************/
void TY_(FileError)( TidyDocImpl* doc, ctmbstr file, TidyReportLevel level )
void TY_(FileError)( TidyDocImpl* doc, ctmbstr file, TidyReportLevel level, uint code )
{
TidyMessageImpl *message = TY_(tidyMessageCreate)( doc, FILE_CANT_OPEN, level, file);
TidyMessageImpl *message = TY_(tidyMessageCreate)( doc, code, level, file);
messageOut( message );
}

View File

@ -59,7 +59,7 @@ void TY_(ReportFatal)(TidyDocImpl* doc, Node* element, Node* node, uint code);
/** @{ */
void TY_(FileError)( TidyDocImpl* doc, ctmbstr file, TidyReportLevel level );
void TY_(FileError)( TidyDocImpl* doc, ctmbstr file, TidyReportLevel level, uint code );
void TY_(ReportAttrError)( TidyDocImpl* doc, Node* node, AttVal* av, uint code );
void TY_(ReportBadArgument)( TidyDocImpl* doc, ctmbstr option );
void TY_(ReportEncodingError)(TidyDocImpl* doc, uint code, uint c, Bool discarded);

View File

@ -903,7 +903,7 @@ FILE* TIDY_CALL tidySetErrorFile( TidyDoc tdoc, ctmbstr errfilnam )
return errout;
}
else /* Emit message to current error sink */
TY_(FileError)( impl, errfilnam, TidyError );
TY_(FileError)( impl, errfilnam, TidyError, FILE_CANT_OPEN );
}
return NULL;
}
@ -1068,11 +1068,21 @@ int TIDY_CALL tidyParseSource( TidyDoc tdoc, TidyInputSource* source )
int tidyDocParseFile( TidyDocImpl* doc, ctmbstr filnam )
{
int status = -ENOENT;
FILE* fin = fopen( filnam, "r+" );
if ( !fin )
{
TY_(FileError)( doc, filnam, TidyError, FILE_NOT_FILE );
return status;
}
#ifdef _WIN32
return TY_(DocParseFileWithMappedFile)( doc, filnam );
#else
int status = -ENOENT;
FILE* fin = fopen( filnam, "rb" );
fclose( fin );
fin = fopen( filnam, "rb" );
#if PRESERVE_FILE_TIMES
struct stat sbuf = {0};
@ -1099,7 +1109,7 @@ int tidyDocParseFile( TidyDocImpl* doc, ctmbstr filnam )
TY_(freeStreamIn)(in);
}
else /* Error message! */
TY_(FileError)( doc, filnam, TidyError );
TY_(FileError)( doc, filnam, TidyError, FILE_CANT_OPEN );
return status;
#endif
}
@ -1213,7 +1223,7 @@ int tidyDocSaveFile( TidyDocImpl* doc, ctmbstr filnam )
#endif /* PRESERVFILETIMES */
}
if ( status < 0 ) /* Error message! */
TY_(FileError)( doc, filnam, TidyError );
TY_(FileError)( doc, filnam, TidyError, FILE_CANT_OPEN );
return status;
}