Commited latest SciTech changes into CVS. This includes updates to the
applet code (with changes copyright headers) as well as updates to the wxImage and dib.cpp modules to use virtual file systems so that we can load these objects from ZIP files correctly. The dib.cpp module was also extensively cleaned up (although the DIB writing code does not presently use file streams as we couldn't figure out if it was possible to write to a ZIP file stream). The code has been tested and functions correctly for both regular files and ZIP files. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10551 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
171
contrib/src/applet/prepifelse.cpp
Normal file
171
contrib/src/applet/prepifelse.cpp
Normal file
@@ -0,0 +1,171 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* wxWindows HTML Applet Package
|
||||
*
|
||||
* Copyright (C) 1991-2001 SciTech Software, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* ========================================================================
|
||||
*
|
||||
* The contents of this file are subject to the wxWindows License
|
||||
* Version 3.0 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.wxwindows.org/licence3.txt
|
||||
*
|
||||
* Software distributed under the License is distributed on an
|
||||
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* ========================================================================
|
||||
*
|
||||
* Language: ANSI C++
|
||||
* Environment: Any
|
||||
*
|
||||
* Description: This file is the implementation of the Preprocessor object
|
||||
* for parsing the <!--#if directive
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
// For compilers that support precompilation
|
||||
#include "wx/wxprec.h"
|
||||
#include "wx/html/forcelnk.h"
|
||||
|
||||
// Include private headers
|
||||
#include "wx/applet/prepifelse.h"
|
||||
#include "wx/applet/ifelsevar.h"
|
||||
|
||||
/*---------------------------- Global variables ---------------------------*/
|
||||
|
||||
|
||||
/*----------------------------- Implementation ----------------------------*/
|
||||
|
||||
/* {SECRET} */
|
||||
/****************************************************************************
|
||||
REMARKS:
|
||||
None of the Reverse Find functions in wxWindows appear to work in a way that
|
||||
can be used by our code. This includes the libstr rfind implementations which
|
||||
do not correctly pass the given return value.
|
||||
****************************************************************************/
|
||||
int ReverseFind(
|
||||
const wxString &tstr,
|
||||
const wxString &str)
|
||||
{
|
||||
wxASSERT( str.GetStringData()->IsValid() );
|
||||
|
||||
// TODO could be made much quicker than that
|
||||
int p = tstr.Len()-str.Len()-1;
|
||||
while ( p >= 0 ) {
|
||||
if ( wxStrncmp(tstr.c_str() + p, str.c_str(), str.Len()) == 0 )
|
||||
return p;
|
||||
p--;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
PARAMETERS:
|
||||
text - HTML to process for if/else blocks
|
||||
|
||||
RETURNS:
|
||||
The string containing the processed HTML
|
||||
|
||||
REMARKS:
|
||||
This function replaces #if, #else, and #endif directives with the text
|
||||
contained within the blocks, dependant on the value of the given boolean
|
||||
variable. The variable is created by making a sub class of wxIfElseVariable.
|
||||
Dynamic class construction is used at run time internally to create an instance
|
||||
of this class and access the value of the variable.
|
||||
|
||||
SEE ALSO:
|
||||
wxIfElseVariable
|
||||
****************************************************************************/
|
||||
wxString wxIfElsePrep::Process(
|
||||
const wxString& text) const
|
||||
{
|
||||
int b;
|
||||
char ft[] = "<!--#if ";
|
||||
|
||||
// make a copy so we can replace text as we go without affecting the original
|
||||
wxString output = text;
|
||||
while ((b = ReverseFind(output.Lower(), ft)) != -1) {
|
||||
// Loop until every #echo directive is found
|
||||
// We search from the end of the string so that #if statements will properly recurse
|
||||
// and we avoid the hassle of matching statements with the correct <!--#endif-->
|
||||
int end, c, n;
|
||||
wxString usecode, code;
|
||||
wxString cname;
|
||||
wxString tag;
|
||||
bool value;
|
||||
|
||||
code = wxString("");
|
||||
|
||||
// grab the tag and get the name of the variable
|
||||
end = (output.Mid(b)).Find("-->");
|
||||
if (end == -1) {
|
||||
#ifdef CHECKED
|
||||
wxMessageBox("wxHTML #if error: Premature end of file while parsing #if.","Error",wxICON_ERROR);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
end += 3;
|
||||
tag = output.Mid(b, end);
|
||||
output.Remove(b, end);
|
||||
|
||||
c = tag.Find("-->");
|
||||
n = c;
|
||||
|
||||
// find the classname
|
||||
c = (tag.Mid(8, n-8)).Find(" ");
|
||||
if (c == -1) n -= 8;
|
||||
else n = c;
|
||||
cname = tag.Mid(8, n);
|
||||
|
||||
cname.Trim(false);
|
||||
c = cname.Find("\"");
|
||||
if (c != -1) cname = cname.Mid(c+1);
|
||||
c = cname.Find("\"");
|
||||
if (c != -1) cname = cname.Mid(0, c);
|
||||
|
||||
// Grab the value from the variable class identified by cname
|
||||
value = wxIfElseVariable::GetValue(cname);
|
||||
|
||||
// Find the end of the tag (<!--#endif-->) and copy it all into the variable code
|
||||
end = ((output.Mid(b)).Lower()).Find("<!--#endif-->");
|
||||
if (end == -1) {
|
||||
#ifdef CHECKED
|
||||
wxMessageBox("wxHTML #if error: Premature end of file while searching for matching #endif.","Error",wxICON_ERROR);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
code = output.Mid(b, end);
|
||||
output.Remove(b, end+13); // remove the entire #if block from original document
|
||||
|
||||
// Find out if there is an else statement
|
||||
end = (code.Lower()).Find("<!--#else-->");
|
||||
if (end != -1) {
|
||||
if (!value) {
|
||||
// Use the else statement
|
||||
usecode = code.Mid(end+12);
|
||||
}
|
||||
else {
|
||||
// Use statement before #else
|
||||
usecode = code.Mid(0, end);
|
||||
}
|
||||
}
|
||||
else if (value) {
|
||||
// There is no #else statement
|
||||
usecode = code;
|
||||
}
|
||||
|
||||
if (usecode != wxString(""))
|
||||
output = (output.Mid(0,b) + usecode + output.Mid(b));
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
FORCE_LINK(ifelsevar)
|
Reference in New Issue
Block a user