/*************************************************************************** * * Copyright (C) 2007 Elad Lahav (elad_lahav@users.sourceforge.net) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ***************************************************************************/ #include "projectbase.h" #include "kscopeconfig.h" #include "cscopefrontend.h" ProjectBase::ProjectBase() { } ProjectBase::~ProjectBase() { } bool ProjectBase::open(const TQString& sPath) { TQFileInfo fi(sPath); // Make sure the file exists, and that is is a cross-reference file if (!fi.exists() || !isCscopeOut(fi.absFilePath())) return false; // Set the project's directory m_dir = fi.dirPath(true); // Set the name of the project to be the full path of the file m_sName = fi.absFilePath(); // Initialise project options (assume source root is the folder holding the // cscope.out file) getDefOptions(m_opt); m_opt.sSrcRootPath = m_dir.absPath(); return true; } /** * Determines if the cscope.out file for this project exists. * @return true if the database exists, false otherwise */ bool ProjectBase::dbExists() { return m_dir.exists("cscope.out"); } void ProjectBase::getOptions(Options& opt) const { getDefOptions(opt); } void ProjectBase::getMakeParams(TQString& sCmd, TQString& sDir) const { sCmd = "make"; sDir = getSourceRoot(); } /** * Fills a structure with default properties for a new project. * Default properties are partly based on the system profile. * @param opt The structure to fill */ void ProjectBase::getDefOptions(Options& opt) { // Set default source path to file-system root opt.sSrcRootPath = "/"; // Initialise MIME-type list opt.slFileTypes.append("*.c"); opt.slFileTypes.append("*.h"); // Set other options opt.bKernel = DEF_IS_KERNEL; opt.bInvIndex = DEF_INV_INDEX; opt.bNoCompress = DEF_NO_COMPRESS; opt.bSlowPathDef = DEF_SLOW_PATH; opt.nACMinChars = DEF_AC_MIN_CHARS; opt.nACDelay = DEF_AC_DELAY; opt.nACMaxEntries = DEF_AC_MAX_ENTRIES; opt.nTabWidth = DEF_TAB_WIDTH; // Set profile-dependant options if (Config().getSysProfile() == KScopeConfig::Fast) { opt.nAutoRebuildTime = 10; opt.bACEnabled = true; } else { opt.nAutoRebuildTime = -1; opt.bACEnabled = false; } } void ProjectBase::initOptions() { // Load the options getOptions(m_opt); // Create the argument list for invoking Cscope m_nArgs = 0; if (m_opt.bKernel) m_nArgs |= CscopeFrontend::Kernel; if (m_opt.bInvIndex) m_nArgs |= CscopeFrontend::InvIndex; if (m_opt.bNoCompress) m_nArgs |= CscopeFrontend::NoCompression; if (m_opt.bSlowPathDef) m_nArgs |= CscopeFrontend::SlowPathDef; } /** * Determines if the given file is a Cscope cross-reference database. * @param sPath The full path of the file to check * @return true if the given file is a cscope.out file, false otherwise */ bool ProjectBase::isCscopeOut(const TQString& sPath) { TQFile file(sPath); TQString sLine; int nVer; char szDir[PATH_MAX]; // Try to open the file if (!file.open(IO_ReadOnly)) return false; // Check if the first line matches the expected format sLine = TQTextStream(&file).readLine(); return sscanf(sLine.latin1(), "cscope %d %s", &nVer, szDir) == 2; } /** * Fills a list object with all files in the project. * List items are created by reading and parsing all file name entries from * the project's 'cscope.files' file. * Note that the file may contain option lines, beginning with a dash. These * should be ignored. * @param pList Pointer to the object to fill */ bool ProjectBase::loadFileList(FileListTarget* pList) { TQString sFilePath; TQFile file; // Make sure the file exists if (!m_dir.exists("cscope.files")) return false; // Open the file file.setName(m_dir.absPath() + "/cscope.files"); if (!file.open(IO_ReadOnly)) return false; // Read all file names from the file TQTextStream str(&file); while ((sFilePath = str.readLine()) != TQString::null) { // Skip option lines if (sFilePath.at(0) == '-') continue; // Set the new list item pList->addItem(sFilePath); } file.close(); return true; }