summaryrefslogtreecommitdiff
path: root/client/docgen/parse.cc
diff options
context:
space:
mode:
Diffstat (limited to 'client/docgen/parse.cc')
-rw-r--r--client/docgen/parse.cc198
1 files changed, 198 insertions, 0 deletions
diff --git a/client/docgen/parse.cc b/client/docgen/parse.cc
new file mode 100644
index 0000000..bcf137b
--- /dev/null
+++ b/client/docgen/parse.cc
@@ -0,0 +1,198 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * parse.cc
+ *
+ * Thu Mar 24 12:07:16 CET 2011
+ * Copyright 2011 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Pracro.
+ *
+ * Pracro is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Pracro is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Pracro; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "parse.h"
+
+#include <QFileInfo>
+#include <QRegExp>
+
+typedef enum {
+ none,
+ indesc,
+ inatt,
+ inmeth,
+ inpar,
+ inret,
+} state_t;
+
+Doc parse(QString filename)
+{
+ Doc doc;
+ doc.screenshot = false;
+ doc.container = false;
+
+ QFileInfo fi(filename);
+ QString name = fi.fileName();
+ doc.name = name.left(name.length() - 2); // Strip ".h"
+
+ state_t state = none;
+
+ fprintf(stderr, "Processing file: %s\n", filename.toStdString().c_str());
+ QFile file(filename);
+ if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ fprintf(stderr, "Could not open %s for reading.\n",
+ filename.toStdString().c_str());
+ return doc;
+ }
+
+ bool running = false;
+ QByteArray data;
+ while(!file.atEnd()) {
+ QString line = file.readLine();
+ if(line.right(1) == "\n") line = line.left(line.length() - 1);
+
+ if(line.contains("*/")) running = false;
+
+ if(running) {
+ line.remove(QRegExp("^[ \t*]*"));
+ printf("line [%s]\n", line.toStdString().c_str());
+
+ if(state == indesc && line.left(1) == "@") state = none;
+ if(state == inatt && line.left(1) == "@") state = none;
+ if(state == inpar && line.left(1) == "@") state = inmeth;
+ if(state == inret && line.left(1) == "@") state = inmeth;
+
+ if(state == none && doc.title == "") {
+ doc.title = line;
+ continue;
+ }
+
+ if(state == none && line.left(4) == "@tag") {
+ doc.tag = line.right(line.length() - line.indexOf(" ") - 1);
+ continue;
+ }
+
+ if(state == none && line.left(8) == "@extends") {
+ doc.extends = line.right(line.length() - line.indexOf(" ") - 1);
+ continue;
+ }
+
+ if(state == none && line.left(11) == "@screenshot") {
+ doc.screenshot = true;
+ continue;
+ }
+
+ if(state == none && line.left(10) == "@container") {
+ doc.container = true;
+ continue;
+ }
+
+ if(state == none && line.left(1) != "@" && doc.description == "") {
+ state = indesc;
+ }
+
+
+ if(state == indesc) {
+ doc.description += line + "\n";
+ continue;
+ }
+
+ if(state == none && line.left(4) == "@att") {
+ Attribute att;
+ att.name = line.mid(5, line.indexOf(" ", 5) - 5);
+ att.description =
+ line.right(line.length() - line.indexOf(" ", 6) - 1) + "\n";
+ doc.attributes.push_back(att);
+ state = inatt;
+ continue;
+ }
+
+ if(state == inatt) {
+ Attribute &a = doc.attributes[doc.attributes.size() - 1];
+ a.description += line + "\n";
+ continue;
+ }
+
+ if((state == none || state == inmeth) && line.left(7) == "@method") {
+ Method meth;
+ meth.name = line.right(line.length() - 7 - 1);
+ doc.methods.push_back(meth);
+ state = inmeth;
+ continue;
+ }
+
+ if(state == inmeth && line.left(1) != "@") {
+ Method &m = doc.methods[doc.methods.size() - 1];
+ m.description += line + "\n";
+ continue;
+ }
+
+ if(state == inmeth && line.left(6) == "@param") {
+ Method &m = doc.methods[doc.methods.size() - 1];
+ Parameter par;
+ par.name = line.mid(7, line.indexOf(" ", 7) - 7);
+ par.description =
+ line.right(line.length() - line.indexOf(" ", 7) - 1) + "\n";
+ m.parameters.push_back(par);
+ state = inpar;
+ continue;
+ }
+
+ if(state == inpar) {
+ Method &m = doc.methods[doc.methods.size() - 1];
+ Parameter &p = m.parameters[m.parameters.size() - 1];
+ p.description += line + "\n";
+ continue;
+ }
+
+ if(state == inmeth && line.left(7) == "@return") {
+ Method &m = doc.methods[doc.methods.size() - 1];
+ m.returns = line.right(line.length() - line.indexOf(" ", 7) - 1) + "\n";
+ state = inret;
+ continue;
+ }
+
+ if(state == inret) {
+ Method &m = doc.methods[doc.methods.size() - 1];
+ m.returns += line + "\n";
+ continue;
+ }
+ }
+
+ if(line == "/***") running = true;
+ }
+
+ return doc;
+}
+
+#ifdef TEST_PARSE
+//Additional dependency files
+//deps:
+//Required cflags (autoconf vars may be used)
+//cflags:
+//Required link options (autoconf vars may be used)
+//libs:
+#include "test.h"
+
+TEST_BEGIN;
+
+// TODO: Put some testcode here (see test.h for usable macros).
+TEST_TRUE(false, "No tests yet!");
+
+TEST_END;
+
+#endif/*TEST_PARSE*/