⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 configure.cpp

📁 pwlib源码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * configure.cxx * * Build options generated by the configure script. * * Portable Windows Library * * Copyright (c) 2003 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.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.mozilla.org/MPL/ * * 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. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Contributor(s): ______________________________________. * * $Log: configure.cpp,v $ * Revision 1.25  2005/08/15 09:40:58  rjongbloed * Captalised the word "disabled" so more obvious. * * Revision 1.24  2005/08/13 19:13:49  shorne * Fix so when feature not found it is marked as disabled. * * Revision 1.23  2004/12/09 02:05:52  csoutheren * Added IF_FEATURE option to allow features dependent on existence/non-existence of *  other features * * Revision 1.22  2004/12/01 11:59:19  csoutheren * Incremented version number * * Revision 1.21  2004/12/01 11:57:03  csoutheren * Fixed problem with not finding MSWIN macros with leading spaces and added ability to enable/disable features using --name as as well as --enable-name * Thank to Guilhem Tardy * * Revision 1.20  2004/08/13 01:08:09  csoutheren * Changed to look for configure.ac, then configure.in * * Revision 1.19  2004/07/12 02:32:58  csoutheren * Fixed problem when more than two elements in env var * * Revision 1.18  2004/04/29 02:02:25  csoutheren * Removed debugging (oops) * * Revision 1.17  2004/04/29 02:00:49  csoutheren * Fixed problem with checking for NULL error return from FindFirstFile rather than INVALID_HANDLE_VALUE * * Revision 1.16  2004/04/04 01:30:37  csoutheren * Added ability to specify exclude environment variable on configure command line which allows easy switching between MSVC and VS.net 2003 * * Revision 1.15  2004/03/23 06:32:01  csoutheren * Fixed problems with multiple directories in exclude spec * * Revision 1.14  2004/03/16 01:45:17  rjongbloed * Fixed locating lbrary in pre-defined search directories. * Added version number to configure program. * Tidied the --help display. * * Revision 1.13  2004/03/13 02:50:56  rjongbloed * Fixed anomalous message where even though a feature was disabled, a "Located " *   directiory message is still displayed causing confusion. * Added --disable-<feature> as synonym to existing --no-<feature> to be compatible *   with autoconf. * Added default value to defines of 1 rather than blank. * * Revision 1.12  2004/01/30 02:33:58  csoutheren * More fixups * * Revision 1.11  2004/01/30 01:43:41  csoutheren * Added excludedir options and environment variable * * Revision 1.10  2003/11/25 08:21:37  rjongbloed * Fixed display of configured items * * Revision 1.9  2003/11/06 09:13:20  rjongbloed * Improved the Windows configure system to allow multiple defines based on file existence. Needed for SDL support of two different distros. * * Revision 1.8  2003/10/30 01:17:15  dereksmithies * Add fix from Jose Luis Urien. Many thanks. * * Revision 1.7  2003/10/23 21:49:51  dereksmithies * Add very sensible fix to limit extent of search. Thanks Ben Lear. * * Revision 1.6  2003/08/04 05:13:17  dereksmithies * Reinforce the disablement if the command lines specifies --no-XXXX to a feature. * * Revision 1.5  2003/08/04 05:07:08  dereksmithies * Command line option now disables feature when feature found on disk. * * Revision 1.4  2003/05/16 02:03:07  rjongbloed * Fixed being able to manually disable a "feature" when does a full disk search. * * Revision 1.3  2003/05/05 08:39:52  robertj * Added ability to explicitly disable a feature, or tell configure exactly *   where features library is so it does not need to search for it. * * Revision 1.2  2003/04/17 03:32:06  robertj * Improved windows configure program to use lines out of configure.in * * Revision 1.1  2003/04/16 08:00:19  robertj * Windoes psuedo autoconf support * */#pragma warning(disable:4786)#include <iostream>#include <fstream>#include <iomanip>#include <string>#include <list>#include <algorithm>#include <stdlib.h>#include <windows.h>#include <vector>#define VERSION "1.4"using namespace std;class Feature{  public:    Feature() : enabled(true) { }    Feature(const string & featureName, const string & optionName, const string & optionValue);    void Parse(const string & optionName, const string & optionValue);    void Adjust(string & line);    bool Locate(const char * testDir);    string featureName;    string displayName;    string directorySymbol;    string simpleDefineName;    string simpleDefineValue;    struct CheckFileInfo {      CheckFileInfo() : found(false), defineName("1") { }      bool Locate(const string & testDir);      bool   found;      string fileName;      string fileText;      string defineName;      string defineValue;    };    list<CheckFileInfo> checkFiles;    list<string> checkDirectories;    list<string> ifFeature;    list<string> ifNotFeature;    string directory;    bool   enabled;};vector<Feature> features;list<string> excludeDirList;///////////////////////////////////////////////////////////////////////Feature::Feature(const string & featureNameParam,                 const string & optionName,                 const string & optionValue)  : featureName(featureNameParam),    enabled(true){  Parse(optionName, optionValue);}void Feature::Parse(const string & optionName, const string & optionValue){  if (optionName == "DISPLAY")    displayName = optionValue;  else if (optionName == "DEFINE") {    int equal = optionValue.find('=');    if (equal == string::npos)      simpleDefineName = optionValue;    else {      simpleDefineName.assign(optionValue, 0, equal);      simpleDefineValue.assign(optionValue, equal+1, INT_MAX);    }  }  else if (optionName == "CHECK_FILE") {    int comma = optionValue.find(',');    if (comma == string::npos)      return;    CheckFileInfo check;    int pipe = optionValue.find('|');    if (pipe < 0 || pipe > comma)      check.fileName.assign(optionValue, 0, comma);    else {      check.fileName.assign(optionValue, 0, pipe);      check.fileText.assign(optionValue, pipe+1, comma-pipe-1);    }    int equal = optionValue.find('=', comma);    if (equal == string::npos)      check.defineName.assign(optionValue, comma+1, INT_MAX);    else {      check.defineName.assign(optionValue, comma+1, equal-comma-1);      check.defineValue.assign(optionValue, equal+1, INT_MAX);    }    checkFiles.push_back(check);  }  else if (optionName == "DIR_SYMBOL")    directorySymbol = '@' + optionValue + '@';  else if (optionName == "CHECK_DIR")    checkDirectories.push_back(optionValue);  else if (optionName == "IF_FEATURE") {    const char * delimiters = ",";    string::size_type lastPos = optionValue.find_first_not_of(delimiters, 0);    string::size_type pos = optionValue.find_first_of(delimiters, lastPos);    while (string::npos != pos || string::npos != lastPos) {      string str = optionValue.substr(lastPos, pos - lastPos);      if (str[0] == '!')        ifNotFeature.push_back(str.substr(1));      else        ifFeature.push_back(str);      lastPos = optionValue.find_first_not_of(delimiters, pos);      pos = optionValue.find_first_of(delimiters, lastPos);    }  }}static bool CompareName(const string & line, const string & name){  int pos = line.find(name);  if (pos == string::npos)    return false;  pos += name.length();  return !isalnum(line[pos]) && line[pos] != '_';}void Feature::Adjust(string & line){  if (enabled && line.find("#undef") != string::npos) {    if (!simpleDefineName.empty() && CompareName(line, simpleDefineName)) {      line = "#define " + simpleDefineName + ' ';      if (simpleDefineValue.empty())        line += '1';      else        line += simpleDefineValue;    }    for (list<CheckFileInfo>::iterator file = checkFiles.begin(); file != checkFiles.end(); file++) {      if (file->found && CompareName(line, file->defineName)) {        line = "#define " + file->defineName + ' ' + file->defineValue;        break;      }    }  }  if (directorySymbol[0] != '\0') {    int pos = line.find(directorySymbol);    if (pos != string::npos)      line.replace(pos, directorySymbol.length(), directory);  }}bool Feature::Locate(const char * testDir){  if (!enabled)    return true;  if (!directory.empty())    return true;  if (checkFiles.empty())    return true;  string testDirectory = testDir;  if (testDirectory[testDirectory.length()-1] != '\\')    testDirectory += '\\';  list<CheckFileInfo>::iterator file = checkFiles.begin();  if (!file->Locate(testDirectory))     return false;    while (++file != checkFiles.end())    file->Locate(testDirectory);  char buf[_MAX_PATH];  _fullpath(buf, testDirectory.c_str(), _MAX_PATH);  directory = buf;  cout << "Located " << displayName << " at " << directory << endl;  int pos;  while ((pos = directory.find('\\')) != string::npos)    directory[pos] = '/';  pos = directory.length()-1;  if (directory[pos] == '/')    directory.erase(pos);  return true;}bool Feature::CheckFileInfo::Locate(const string & testDirectory){  string filename = testDirectory + fileName;  ifstream file(filename.c_str(), ios::in);  if (!file.is_open())    return false;  if (fileText.empty())    found = true;  else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -