summaryrefslogtreecommitdiffstats
path: root/src/projectbase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/projectbase.cpp')
-rw-r--r--src/projectbase.cpp190
1 files changed, 190 insertions, 0 deletions
diff --git a/src/projectbase.cpp b/src/projectbase.cpp
new file mode 100644
index 0000000..f99c045
--- /dev/null
+++ b/src/projectbase.cpp
@@ -0,0 +1,190 @@
+/***************************************************************************
+ *
+ * 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 QString& sPath)
+{
+ QFileInfo 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(QString& sCmd, QString& 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 QString& sPath)
+{
+ QFile file(sPath);
+ QString 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 = QTextStream(&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)
+{
+ QString sFilePath;
+ QFile 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
+ QTextStream str(&file);
+ while ((sFilePath = str.readLine()) != QString::null) {
+ // Skip option lines
+ if (sFilePath.at(0) == '-')
+ continue;
+
+ // Set the new list item
+ pList->addItem(sFilePath);
+ }
+
+ file.close();
+ return true;
+}