From 46e9a5e08f44687f6393dbaaef0dd9bb4ebfa1d2 Mon Sep 17 00:00:00 2001
From: Hector Oswaldo Caballero <hector.caballero@ericsson.com>
Date: Tue, 28 Apr 2015 10:05:26 +0200
Subject: [PATCH] [ttcn-cfg mode] Add

---
 doc/compress.html         |   1 +
 mode/index.html           |   1 +
 mode/ttcn-cfg/index.html  | 115 ++++++++++++++++++++
 mode/ttcn-cfg/ttcn-cfg.js | 214 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 331 insertions(+)
 create mode 100644 mode/ttcn-cfg/index.html
 create mode 100644 mode/ttcn-cfg/ttcn-cfg.js

diff --git a/doc/compress.html b/doc/compress.html
index d7ef62de6..1775c5a18 100644
--- a/doc/compress.html
+++ b/doc/compress.html
@@ -194,6 +194,7 @@
           <option value="http://codemirror.net/mode/tornado/tornado.js">tornado.js</option>
           <option value="http://codemirror.net/mode/troff/troff.js">troff.js</option>
           <option value="http://codemirror.net/mode/ttcn/ttcn.js">ttcn.js</option>
+          <option value="http://codemirror.net/mode/ttcn-cfg/ttcn-cfg.js">ttcn-cfg.js</option>
           <option value="http://codemirror.net/mode/turtle/turtle.js">turtle.js</option>
           <option value="http://codemirror.net/mode/vb/vb.js">vb.js</option>
           <option value="http://codemirror.net/mode/vbscript/vbscript.js">vbscript.js</option>
diff --git a/mode/index.html b/mode/index.html
index 5d895cacc..6358acef7 100644
--- a/mode/index.html
+++ b/mode/index.html
@@ -124,6 +124,7 @@ option.</p>
       <li><a href="tornado/index.html">Tornado</a> (templating language)</li>
       <li><a href="troff/index.html">troff</a> (for manpages)</li>
       <li><a href="ttcn/index.html">TTCN</a></li>
+      <li><a href="ttcn-cfg/index.html">TTCN Configuration</a></li>
       <li><a href="turtle/index.html">Turtle</a></li>
       <li><a href="vb/index.html">VB.NET</a></li>
       <li><a href="vbscript/index.html">VBScript</a></li>
diff --git a/mode/ttcn-cfg/index.html b/mode/ttcn-cfg/index.html
new file mode 100644
index 000000000..4a4cd4571
--- /dev/null
+++ b/mode/ttcn-cfg/index.html
@@ -0,0 +1,115 @@
+<!doctype html>
+
+<title>CodeMirror: TTCN-CFG mode</title>
+<meta charset="utf-8"/>
+<link rel=stylesheet href="../../doc/docs.css">
+
+<link rel="stylesheet" href="../../lib/codemirror.css">
+<script src="../../lib/codemirror.js"></script>
+<script src="ttcn-cfg.js"></script>
+<style type="text/css">
+    .CodeMirror {
+        border-top: 1px solid black;
+        border-bottom: 1px solid black;
+    }
+</style>
+<div id=nav>
+    <a href="http://codemirror.net"><h1>CodeMirror</h1>
+        <img id=logo src="../../doc/logo.png">
+    </a>
+
+    <ul>
+        <li><a href="../../index.html">Home</a>
+        <li><a href="../../doc/manual.html">Manual</a>
+        <li><a href="https://github.com/codemirror/codemirror">Code</a>
+    </ul>
+    <ul>
+        <li><a href="../index.html">Language modes</a>
+        <li><a class=active href="http://en.wikipedia.org/wiki/TTCN">TTCN-CFG</a>
+    </ul>
+</div>
+<article>
+    <h2>TTCN-CFG example</h2>
+    <div>
+        <textarea id="ttcn-cfg-code">
+[MODULE_PARAMETERS]
+# This section shall contain the values of all parameters that are defined in your TTCN-3 modules.
+
+[LOGGING]
+# In this section you can specify the name of the log file and the classes of events
+# you want to log into the file or display on console (standard error).
+
+LogFile := "logs/%e.%h-%r.%s"
+FileMask := LOG_ALL | DEBUG | MATCHING
+ConsoleMask := ERROR | WARNING | TESTCASE | STATISTICS | PORTEVENT
+
+LogSourceInfo := Yes
+AppendFile := No
+TimeStampFormat := DateTime
+LogEventTypes := Yes
+SourceInfoFormat := Single
+LogEntityName := Yes
+
+[TESTPORT_PARAMETERS]
+# In this section you can specify parameters that are passed to Test Ports.
+
+[DEFINE]
+# In this section you can create macro definitions,
+# that can be used in other configuration file sections except [INCLUDE].
+
+[INCLUDE]
+# To use configuration settings given in other configuration files,
+# the configuration files just need to be listed in this section, with their full or relative pathnames.
+
+[EXTERNAL_COMMANDS]
+# This section can define external commands (shell scripts) to be executed by the ETS
+# whenever a control part or test case is started or terminated.
+
+BeginTestCase := ""
+EndTestCase := ""
+BeginControlPart := ""
+EndControlPart := ""
+
+[EXECUTE]
+# In this section you can specify what parts of your test suite you want to execute.
+
+[GROUPS]
+# In this section you can specify groups of hosts. These groups can be used inside the
+# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts.
+
+[COMPONENTS]
+# This section consists of rules restricting the location of created PTCs.
+
+[MAIN_CONTROLLER]
+# The options herein control the behavior of MC.
+
+TCPPort := 0
+KillTimer := 10.0
+NumHCs := 0
+LocalAddress :=
+        </textarea>
+    </div>
+
+    <script> 
+      var ttcnEditor = CodeMirror.fromTextArea(document.getElementById("ttcn-cfg-code"), {
+        lineNumbers: true,
+        matchBrackets: true,
+        mode: "text/x-ttcn-cfg"
+      });
+      ttcnEditor.setSize(600, 860);
+      var mac = CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault;
+      CodeMirror.keyMap.default[(mac ? "Cmd" : "Ctrl") + "-Space"] = "autocomplete";
+    </script>
+    <br/>
+    <p><strong>Language:</strong> Testing and Test Control Notation -
+        Configuration files
+        (<a href="http://en.wikipedia.org/wiki/TTCN">TTCN-CFG</a>)
+    </p>
+    <p><strong>MIME types defined:</strong> <code>text/x-ttcn-cfg</code>.</p>
+
+    <br/>
+    <p>The development of this mode has been sponsored by <a href="http://www.ericsson.com/">Ericsson
+    </a>.</p>
+    <p>Coded by Asmelash Tsegay Gebretsadkan </p>
+</article>
+
diff --git a/mode/ttcn-cfg/ttcn-cfg.js b/mode/ttcn-cfg/ttcn-cfg.js
new file mode 100644
index 000000000..e10805119
--- /dev/null
+++ b/mode/ttcn-cfg/ttcn-cfg.js
@@ -0,0 +1,214 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+
+  CodeMirror.defineMode("ttcn-cfg", function(config, parserConfig) {
+    var indentUnit = config.indentUnit,
+        keywords = parserConfig.keywords || {},
+        fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {},
+        externalCommands = parserConfig.externalCommands || {},
+        multiLineStrings = parserConfig.multiLineStrings,
+        indentStatements = parserConfig.indentStatements !== false;
+    var isOperatorChar = /[\|]/;
+    var curPunc;
+
+    function tokenBase(stream, state) {
+      var ch = stream.next();
+      if (ch == '"' || ch == "'") {
+        state.tokenize = tokenString(ch);
+        return state.tokenize(stream, state);
+      }
+      if (/[:=]/.test(ch)) {
+        curPunc = ch;
+        return "punctuation";
+      }
+      if (ch == "#"){
+        stream.skipToEnd();
+        return "comment";
+      }
+      if (/\d/.test(ch)) {
+        stream.eatWhile(/[\w\.]/);
+        return "number";
+      }
+      if (isOperatorChar.test(ch)) {
+        stream.eatWhile(isOperatorChar);
+        return "operator";
+      }
+      if (ch == "["){
+        stream.eatWhile(/[\w_\]]/);
+        return "number sectionTitle";
+      }
+
+      stream.eatWhile(/[\w\$_]/);
+      var cur = stream.current();
+      if (keywords.propertyIsEnumerable(cur)) return "keyword";
+      if (fileNCtrlMaskOptions.propertyIsEnumerable(cur))
+        return "negative fileNCtrlMaskOptions";
+      if (externalCommands.propertyIsEnumerable(cur)) return "negative externalCommands";
+
+      return "variable";
+    }
+
+    function tokenString(quote) {
+      return function(stream, state) {
+        var escaped = false, next, end = false;
+        while ((next = stream.next()) != null) {
+          if (next == quote && !escaped){
+            var afterNext = stream.peek();
+            //look if the character if the quote is like the B in '10100010'B
+            if (afterNext){
+              afterNext = afterNext.toLowerCase();
+              if(afterNext == "b" || afterNext == "h" || afterNext == "o")
+                stream.next();
+            }
+            end = true; break;
+          }
+          escaped = !escaped && next == "\\";
+        }
+        if (end || !(escaped || multiLineStrings))
+          state.tokenize = null;
+        return "string";
+      };
+    }
+
+    function Context(indented, column, type, align, prev) {
+      this.indented = indented;
+      this.column = column;
+      this.type = type;
+      this.align = align;
+      this.prev = prev;
+    }
+    function pushContext(state, col, type) {
+      var indent = state.indented;
+      if (state.context && state.context.type == "statement")
+        indent = state.context.indented;
+      return state.context = new Context(indent, col, type, null, state.context);
+    }
+    function popContext(state) {
+      var t = state.context.type;
+      if (t == ")" || t == "]" || t == "}")
+        state.indented = state.context.indented;
+      return state.context = state.context.prev;
+    }
+
+    //Interface
+    return {
+      startState: function(basecolumn) {
+        return {
+          tokenize: null,
+          context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
+          indented: 0,
+          startOfLine: true
+        };
+      },
+
+      token: function(stream, state) {
+        var ctx = state.context;
+        if (stream.sol()) {
+          if (ctx.align == null) ctx.align = false;
+          state.indented = stream.indentation();
+          state.startOfLine = true;
+        }
+        if (stream.eatSpace()) return null;
+        curPunc = null;
+        var style = (state.tokenize || tokenBase)(stream, state);
+        if (style == "comment") return style;
+        if (ctx.align == null) ctx.align = true;
+
+        if ((curPunc == ";" || curPunc == ":" || curPunc == ",")
+            && ctx.type == "statement"){
+          popContext(state);
+        }
+        else if (curPunc == "{") pushContext(state, stream.column(), "}");
+        else if (curPunc == "[") pushContext(state, stream.column(), "]");
+        else if (curPunc == "(") pushContext(state, stream.column(), ")");
+        else if (curPunc == "}") {
+          while (ctx.type == "statement") ctx = popContext(state);
+          if (ctx.type == "}") ctx = popContext(state);
+          while (ctx.type == "statement") ctx = popContext(state);
+        }
+        else if (curPunc == ctx.type) popContext(state);
+        else if (indentStatements && (((ctx.type == "}" || ctx.type == "top")
+            && curPunc != ';') || (ctx.type == "statement"
+            && curPunc == "newstatement")))
+          pushContext(state, stream.column(), "statement");
+        state.startOfLine = false;
+        return style;
+      },
+
+      electricChars: "{}",
+      lineComment: "#",
+      fold: "brace"
+    };
+  });
+
+  function words(str) {
+    var obj = {}, words = str.split(" ");
+    for (var i = 0; i < words.length; ++i)
+      obj[words[i]] = true;
+    return obj;
+  }
+
+  CodeMirror.defineMIME("text/x-ttcn-cfg", {
+    name: "ttcn-cfg",
+    keywords: words("Yes No LogFile FileMask ConsoleMask AppendFile" +
+    " TimeStampFormat LogEventTypes SourceInfoFormat" +
+    " LogEntityName LogSourceInfo DiskFullAction" +
+    " LogFileNumber LogFileSize MatchingHints Detailed" +
+    " Compact SubCategories Stack Single None Seconds" +
+    " DateTime Time Stop Error Retry Delete TCPPort KillTimer" +
+    " NumHCs UnixSocketsEnabled LocalAddress"),
+    fileNCtrlMaskOptions: words("TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING" +
+    " TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP" +
+    " TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION" +
+    " TTCN_USER TTCN_FUNCTION TTCN_STATISTICS" +
+    " TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG" +
+    " EXECUTOR ERROR WARNING PORTEVENT TIMEROP" +
+    " VERDICTOP DEFAULTOP TESTCASE ACTION USER" +
+    " FUNCTION STATISTICS PARALLEL MATCHING DEBUG" +
+    " LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED" +
+    " DEBUG_ENCDEC DEBUG_TESTPORT" +
+    " DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE" +
+    " DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT" +
+    " DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED" +
+    " EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA" +
+    " EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS" +
+    " EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED" +
+    " FUNCTION_RND FUNCTION_UNQUALIFIED" +
+    " MATCHING_DONE MATCHING_MCSUCCESS" +
+    " MATCHING_MCUNSUCC MATCHING_MMSUCCESS" +
+    " MATCHING_MMUNSUCC MATCHING_PCSUCCESS" +
+    " MATCHING_PCUNSUCC MATCHING_PMSUCCESS" +
+    " MATCHING_PMUNSUCC MATCHING_PROBLEM" +
+    " MATCHING_TIMEOUT MATCHING_UNQUALIFIED" +
+    " PARALLEL_PORTCONN PARALLEL_PORTMAP" +
+    " PARALLEL_PTC PARALLEL_UNQUALIFIED" +
+    " PORTEVENT_DUALRECV PORTEVENT_DUALSEND" +
+    " PORTEVENT_MCRECV PORTEVENT_MCSEND" +
+    " PORTEVENT_MMRECV PORTEVENT_MMSEND" +
+    " PORTEVENT_MQUEUE PORTEVENT_PCIN" +
+    " PORTEVENT_PCOUT PORTEVENT_PMIN" +
+    " PORTEVENT_PMOUT PORTEVENT_PQUEUE" +
+    " PORTEVENT_STATE PORTEVENT_UNQUALIFIED" +
+    " STATISTICS_UNQUALIFIED STATISTICS_VERDICT" +
+    " TESTCASE_FINISH TESTCASE_START" +
+    " TESTCASE_UNQUALIFIED TIMEROP_GUARD" +
+    " TIMEROP_READ TIMEROP_START TIMEROP_STOP" +
+    " TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED" +
+    " USER_UNQUALIFIED VERDICTOP_FINAL" +
+    " VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT" +
+    " VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED"),
+    externalCommands: words("BeginControlPart EndControlPart BeginTestCase" +
+    " EndTestCase"),
+    multiLineStrings: true
+  });
+});
\ No newline at end of file
-- 
GitLab