/**************************************************************************** * * 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 "; char ftelse[] = ""; char ftnot[] = "", b + strlen(ftelif)); if (e == wxString::npos) { #ifdef CHECKED wxMessageBox("wxHTML #elif error: Premature end of file while parsing #elif.","Error",wxICON_ERROR); #endif break; } // Convert to lower case so find is easy, grab everything after #elif tag wxString remains = (output.Mid(e+strlen("-->"))).Lower(); // find matching else or endif int nextif, nextendif; int ifcount = 1, min = 0; do { nextif = remains.find(ft, min); nextendif = remains.find(ftend, min); if (nextif < nextendif && nextif != wxString::npos) { ifcount++; min = nextif+1; } else { ifcount--; min = nextendif+1; } if (nextendif == wxString::npos) { #ifdef CHECKED wxMessageBox("wxHTML #elif error: Premature end of file before finding #endif.","Error",wxICON_ERROR); #endif break; } // once ifcount reaches 0 again we have found our matchin #endif } while (ifcount > 0); // If it couldn't be found die gracefully if (nextendif == wxString::npos) { // We already displayed a message, just break all the way out break; } int elifsize = e - (b + strlen(ftelif)) + strlen("-->"); // Create the #if/else block, removing the #elif code output = output.Mid(0, b) + wxString(wxString(ftelse)+wxString(ft)) + output.Mid(b+strlen(ftelif), elifsize+nextendif) + wxString(ftend) + output.Mid(b+strlen(ftelif)+elifsize+nextendif); } // Parse out the if else blocks themselves while ((b = ReverseFind(output.Lower(), ft)) != -1) { // Loop until every #if 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 bool notval = false; int off = 0; int end; 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; // remove the sections from the tag before passing it on to be parsed tag = output.Mid(b+strlen(ft), end-strlen(ft)-3); output.Remove(b, end); value = ParseIfStatementValue(tag); // Find the end of the tag () and copy it all into the variable code end = ((output.Mid(b)).Lower()).Find(ftend); 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+strlen(ftend)); // remove the entire #if block from original document // Find out if there is an else statement end = (code.Lower()).Find(ftelse); if (end != -1) { if (!value) { // Use the else statement usecode = code.Mid(end+strlen(ftelse)); } 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)