mime.types entries with all fields on same line parsed correctly

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1943 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1999-03-17 16:25:49 +00:00
parent da7b3583d8
commit 22b4634c61

View File

@ -492,6 +492,16 @@ wxMimeTypesManager::GetFileTypeFromMimeType(const wxString& mimeType)
return m_impl->GetFileTypeFromMimeType(mimeType);
}
void wxMimeTypesManager::ReadMailcap(const wxString& filename)
{
m_impl->ReadMailcap(filename);
}
void wxMimeTypesManager::ReadMimeTypes(const wxString& filename)
{
m_impl->ReadMimeTypes(filename);
}
// ============================================================================
// real (OS specific) implementation
// ============================================================================
@ -889,17 +899,27 @@ void wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
wxString strMimeType, strDesc, strExtensions;
size_t nLineCount = file.GetLineCount();
const char *pc = NULL;
for ( size_t nLine = 0; nLine < nLineCount; nLine++ ) {
// now we're at the start of the line
const char *pc = file[nLine].c_str();
if ( pc == NULL ) {
// now we're at the start of the line
pc = file[nLine].c_str();
}
else {
// we didn't finish with the previous line yet
nLine--;
}
// skip whitespace
while ( isspace(*pc) )
pc++;
// comment?
if ( *pc == '#' )
if ( *pc == '#' ) {
// skip the whole line
pc = NULL;
continue;
}
// detect file format
const char *pEqualSign = strchr(pc, '=');
@ -944,7 +964,7 @@ void wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
}
}
else {
// unquoted stringends at the first space
// unquoted string ends at the first space
for ( pEnd = pc; !isspace(*pEnd); pEnd++ )
;
}
@ -952,8 +972,7 @@ void wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
// now we have the RHS (field value)
wxString strRHS(pc, pEnd - pc);
// check that it's more or less what we're waiting for, i.e. that
// only '\' is left on the line
// check what follows this entry
if ( *pEnd == '"' ) {
// skip this quote
pEnd++;
@ -962,14 +981,13 @@ void wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
for ( pc = pEnd; isspace(*pc); pc++ )
;
// only '\\' may be left on the line normally
bool entryEnded = *pc == '\0';
if ( !entryEnded && ((*pc != '\\') || (*++pc != '\0')) ) {
wxLogWarning(_("Mime.types file %s, line %d: extra characters "
"after the field value ignored."),
strFileName.c_str(), nLine + 1);
// if there is something left, it may be either a '\\' to continue
// the line or the next field of the same entry
bool entryEnded = *pc == '\0',
nextFieldOnSameLine = FALSE;
if ( !entryEnded ) {
nextFieldOnSameLine = ((*pc != '\\') || (pc[1] != '\0'));
}
// if there is a trailing backslash entryEnded = FALSE
// now see what we got
if ( strLHS == "type" ) {
@ -987,8 +1005,13 @@ void wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
}
if ( !entryEnded ) {
// as we don't reset strMimeType, the next line in this entry
if ( !nextFieldOnSameLine )
pc = NULL;
//else: don't reset it
// as we don't reset strMimeType, the next field in this entry
// will be interpreted correctly.
continue;
}
}
@ -1018,6 +1041,9 @@ void wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
}
m_aExtensions[index] += strExtensions;
}
// finished with this line
pc = NULL;
}
// check our data integriry