qemacs-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemacs-commit] qemacs extra-modes.c


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs extra-modes.c
Date: Thu, 24 Apr 2014 22:06:12 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        14/04/24 22:06:12

Modified files:
        .              : extra-modes.c 

Log message:
        add coloring mode for Julia language

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/extra-modes.c?cvsroot=qemacs&r1=1.16&r2=1.17

Patches:
Index: extra-modes.c
===================================================================
RCS file: /sources/qemacs/qemacs/extra-modes.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- extra-modes.c       15 Apr 2014 08:04:19 -0000      1.16
+++ extra-modes.c       24 Apr 2014 22:06:11 -0000      1.17
@@ -1372,6 +1372,287 @@
     return 0;
 }
 
+/*---------------- Julia coloring ----------------*/
+
+static char const julia_keywords[] = {
+    "abstract|assert|baremodule|begin|bitstype|break|catch|ccall|"
+    "const|continue|do|else|elseif|end|export|finally|for|function|"
+    "global|if|immutable|import|importall|in|let|local|macro|module|"
+    "quote|return|sizeof|throw|try|type|typeof|using|while|yieldto|"
+};
+
+static char const julia_types[] = {
+    "Int8|Uint8|Int16|Uint16|Int32|Uint32|Int64|Uint64|Int128|Uint128|"
+    "Bool|Char|Float16|Float32|Float64|Int|Uint|BigInt|BigFloat|"
+    "Array|Union|Nothing|SubString|UTF8String|"
+    "None|Any|ASCIIString|DataType|Complex|RegexMatch|Symbol|Expr|"
+    "VersionNumber|Exception|"
+    "Number|Real|FloatingPoint|Integer|Signed|Unsigned|"
+    "Vector|Matrix|UnionType|"
+    "ArgumentError|BoundsError|DivideError|DomainError|EOFError|"
+    "ErrorException|InexactError|InterruptException|KeyError|LoadError|"
+    "MemoryError|MethodError|OverflowError|ParseError|SystemError|"
+    "TypeError|UndefRefError|"
+    "Range|Function|Dict|"
+};
+
+static char const julia_constants[] = {
+    "false|true|Inf16|NaN16|Inf32|NaN32|Inf|NaN|im|nothing|pi|e|"
+};
+
+#if 0
+static char const julia_builtin[] = {
+    "include|new|convert|promote|eval|super|isa|bits|eps|"
+    "nextfloat|prevfloat|typemin|typemax|println|zero|one|"
+    "complex|num|den|float|int|char|length|endof|"
+    "info|warn|error|"
+};
+#endif
+
+enum {
+    IN_JULIA_STRING      = 0x10,
+    IN_JULIA_STRING_BQ   = 0x20,
+    IN_JULIA_LONG_STRING = 0x40,
+};
+
+enum {
+    JULIA_STYLE_TEXT =     QE_STYLE_DEFAULT,
+    JULIA_STYLE_COMMENT =  QE_STYLE_COMMENT,
+    JULIA_STYLE_STRING =   QE_STYLE_STRING,
+    JULIA_STYLE_NUMBER =   QE_STYLE_NUMBER,
+    JULIA_STYLE_KEYWORD =  QE_STYLE_KEYWORD,
+    JULIA_STYLE_TYPE =     QE_STYLE_TYPE,
+    JULIA_STYLE_FUNCTION = QE_STYLE_FUNCTION,
+    JULIA_STYLE_SYMBOL =   QE_STYLE_NUMBER,
+};
+
+static inline int julia_is_name(int c) {
+    return qe_isalpha_(c) || c > 0xA0;
+}
+
+static inline int julia_is_name1(int c) {
+    return qe_isalnum_(c) || c == '!' || c > 0xA0;
+}
+
+static int julia_get_name(char *buf, int buf_size, const unsigned int *p)
+{
+    buf_t outbuf, *out;
+    int i = 0;
+
+    out = buf_init(&outbuf, buf, buf_size);
+
+    if (julia_is_name(p[i])) {
+        buf_putc_utf8(out, p[i]);
+        for (i++; julia_is_name1(p[i]); i++) {
+            buf_putc_utf8(out, p[i]);
+        }
+    }
+    return i;
+}
+
+int julia_get_number(const unsigned int *p)
+{
+    const unsigned int *p0 = p;
+    int c;
+
+    c = *p++;
+    if (c == '0' && qe_tolower(*p) == 'o' && qe_isoctdigit(p[1])) {
+        /* octal numbers */
+        for (p += 2; qe_isoctdigit(*p); p++)
+            continue;
+    } else
+    if (c == '0' && qe_tolower(*p) == 'x' && qe_isxdigit(p[1])) {
+        /* hexadecimal numbers */
+        for (p += 2; qe_isxdigit(*p); p++)
+            continue;
+        /* parse hexadecimal floats */
+        if (*p == '.') {
+            for (p += 1; qe_isxdigit(*p); p++)
+                continue;
+        }
+        if (qe_tolower(*p) == 'p') {
+            int k = 1;
+            if (p[k] == '+' || p[k] == '-')
+                k++;
+            if (qe_isdigit(p[k])) {
+                for (p += k + 1; qe_isdigit(*p); p++)
+                    continue;
+            }
+        }
+    } else
+    if (qe_isdigit(c)) {
+        /* decimal numbers */
+        for (; qe_isdigit(*p); p++)
+            continue;
+        if (*p == '.') {
+            for (p += 1; qe_isdigit(*p); p++)
+                continue;
+        }
+        if ((c = qe_tolower(*p)) == 'e' || c == 'f') {
+            int k = 1;
+            if (p[k] == '+' || p[k] == '-')
+                k++;
+            if (qe_isdigit(p[k])) {
+                for (p += k + 1; qe_isdigit(*p); p++)
+                    continue;
+            }
+        }
+    } else {
+        p -= 1;
+    }
+    return p - p0;
+}
+
+void julia_colorize_line(QEColorizeContext *cp,
+                         unsigned int *str, int n, int mode_flags)
+{
+    int i = 0, start = i, c, sep = 0, klen;
+    int state = cp->colorize_state;
+    char kbuf[32];
+
+    if (state & IN_JULIA_STRING) {
+        sep = '\"';
+        goto parse_string;
+    }
+    if (state & IN_JULIA_STRING_BQ) {
+        sep = '`';
+        goto parse_string;
+    }
+    if (state & IN_JULIA_LONG_STRING) {
+        sep = '\"';
+        goto parse_long_string;
+    }
+
+    while (i < n) {
+        start = i;
+        c = str[i++];
+        switch (c) {
+        case '#':
+            i = n;
+            SET_COLOR(str, start, i, JULIA_STYLE_COMMENT);
+            continue;
+
+        case '\'':
+            if (start > 0 && (julia_is_name1(str[i - 2]) || str[i - 2] == '.'))
+                break;
+            sep = c;
+            state = IN_JULIA_STRING_BQ;
+            goto parse_string;
+
+        case '`':
+            sep = c;
+            goto parse_string;
+
+        case '\"':
+        has_string:
+            /* parse string or character const */
+            sep = c;
+            state = IN_JULIA_STRING;
+            if (str[i] == sep && str[i + 1] == sep) {
+                /* multi-line string """ ... """ */
+                state = IN_JULIA_LONG_STRING;
+                i += 2;
+            parse_long_string:
+                while (i < n) {
+                    c = str[i++];
+                    if (c == '\\') {
+                        if (i < n) {
+                            i += 1;
+                        }
+                    } else
+                    if (c == sep && str[i] == sep && str[i + 1] == sep) {
+                        i += 2;
+                        state = 0;
+                        break;
+                    }
+                }
+            } else {
+            parse_string:
+                while (i < n) {
+                    c = str[i++];
+                    if (c == '\\') {
+                        if (i < n) {
+                            i += 1;
+                        }
+                    } else
+                    if (c == sep) {
+                        state = 0;
+                        break;
+                    }
+                }
+            }
+            while (qe_findchar("imsx", str[i])) {
+                /* regex suffix */
+                i++;
+            }
+            SET_COLOR(str, start, i, JULIA_STYLE_STRING);
+            continue;
+
+        default:
+            if (qe_isdigit(c)) {
+                /* numbers can be directly adjacent to identifiers */
+                klen = julia_get_number(str + i - 1);
+                i += klen - 1;
+                SET_COLOR(str, start, i, JULIA_STYLE_NUMBER);
+                continue;
+            }
+            if (julia_is_name(c)) {
+                klen = julia_get_name(kbuf, sizeof(kbuf), str + i - 1);
+                i += klen - 1;
+                if (str[i] == '"') {
+                    c = str[i++];
+                    goto has_string;
+                }
+                if (strfind(julia_keywords, kbuf)
+                ||  strfind(julia_constants, kbuf)) {
+                    SET_COLOR(str, start, i, JULIA_STYLE_KEYWORD);
+                    continue;
+                }
+                if (strfind(julia_types, kbuf)) {
+                    SET_COLOR(str, start, i, JULIA_STYLE_TYPE);
+                    continue;
+                }
+                if (str[i] == '(' || (str[i] == ' ' && str[i + 1] == '(')) {
+                    SET_COLOR(str, start, i, JULIA_STYLE_FUNCTION);
+                    continue;
+                }
+                continue;
+            }
+            break;
+        }
+    }
+    cp->colorize_state = state;
+}
+
+static int julia_mode_probe(ModeDef *mode, ModeProbeData *p)
+{
+    if (match_extension(p->filename, mode->extensions))
+        return 80;
+
+    return 1;
+}
+
+static CmdDef julia_commands[] = {
+    CMD_DEF_END,
+};
+
+static ModeDef julia_mode;
+
+static int julia_init(void)
+{
+    /* julia mode is almost like the text mode, so we copy and patch it */
+    memcpy(&julia_mode, &text_mode, sizeof(ModeDef));
+    julia_mode.name = "Julia";
+    julia_mode.extensions = "jl";
+    julia_mode.mode_probe = julia_mode_probe;
+    julia_mode.colorize_func = julia_colorize_line;
+
+    qe_register_mode(&julia_mode);
+    qe_register_cmd_table(julia_commands, &julia_mode);
+
+    return 0;
+}
+
 /*---------------- Haskell coloring ----------------*/
 
 static char const haskell_keywords[] = {
@@ -2558,6 +2839,7 @@
     ps_init();
     sql_init();
     lua_init();
+    julia_init();
     haskell_init();
     python_init();
     ruby_init();



reply via email to

[Prev in Thread] Current Thread [Next in Thread]