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, 14 May 2015 07:34:42 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        15/05/14 07:34:41

Modified files:
        .              : extra-modes.c 

Log message:
        added Smalltalk colorizer

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

Patches:
Index: extra-modes.c
===================================================================
RCS file: /sources/qemacs/qemacs/extra-modes.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- extra-modes.c       9 May 2015 22:22:22 -0000       1.39
+++ extra-modes.c       14 May 2015 07:34:39 -0000      1.40
@@ -3929,6 +3929,181 @@
     return 0;
 }
 
+/*---------------- Smalltalk coloring ----------------*/
+
+enum {
+    IN_SMALLTALK_COMMENT = 0x01,
+    IN_SMALLTALK_STRING  = 0x02,
+};
+
+enum {
+    SMALLTALK_STYLE_TEXT =       QE_STYLE_DEFAULT,
+    SMALLTALK_STYLE_COMMENT =    QE_STYLE_COMMENT,
+    SMALLTALK_STYLE_STRING =     QE_STYLE_STRING,
+    SMALLTALK_STYLE_CHARCONST =  QE_STYLE_STRING,
+    SMALLTALK_STYLE_NUMBER =     QE_STYLE_NUMBER,
+    SMALLTALK_STYLE_KEYWORD =    QE_STYLE_KEYWORD,
+    SMALLTALK_STYLE_TYPE =       QE_STYLE_TYPE,
+    SMALLTALK_STYLE_FUNCTION =   QE_STYLE_FUNCTION,
+    SMALLTALK_STYLE_IDENTIFIER = QE_STYLE_DEFAULT,
+};
+
+static char const smalltalk_keywords[] = {
+    "|super|self|new|true|false|nil"
+    "|"
+};
+
+static char const smalltalk_types[] = {
+    "|"
+};
+
+static void smalltalk_colorize_line(QEColorizeContext *cp,
+                                    unsigned int *str, int n, ModeDef *syn)
+{
+    char keyword[MAX_KEYWORD_SIZE];
+    int i = 0, start = i, c, style = 0, len;
+    int state = cp->colorize_state;
+
+    if (state & IN_SMALLTALK_COMMENT)
+        goto parse_comment;
+    if (state & IN_SMALLTALK_STRING)
+        goto parse_string;
+
+    while (i < n) {
+        start = i;
+        c = str[i++];
+        switch (c) {
+        case '\"':
+            state = IN_SMALLTALK_COMMENT;
+        parse_comment:
+            for (; i < n; i++) {
+                if (str[i] == (unsigned int)'\"') {
+                    state = 0;
+                    i++;
+                    break;
+                }
+            }
+            style = SMALLTALK_STYLE_COMMENT;
+            break;
+
+        case '\'':
+            state = IN_SMALLTALK_STRING;
+        parse_string:
+            for (; i < n; i++) {
+                if (str[i] == (unsigned int)'\'') {
+                    state = 0;
+                    i++;
+                    break;
+                }
+            }
+            style = SMALLTALK_STYLE_STRING;
+            break;
+
+        case '$':
+            if (i < n) {
+                i++;
+                style = SMALLTALK_STYLE_CHARCONST;
+            }
+            break;
+
+        default:
+            if (qe_isalpha(c)) {
+                /* parse identifiers and keywords */
+                len = 0;
+                keyword[len++] = c;
+                /* should allow other chars: .+/\*~<>@%|&? */
+                for (; i < n && qe_isalnum(str[i]); i++) {
+                    if (len < countof(keyword) - 1)
+                        keyword[len++] = str[i];
+                }
+                keyword[len] = '\0';
+                if (strfind(syn->keywords, keyword))
+                    style = SMALLTALK_STYLE_KEYWORD;
+                else
+                if (strfind(syn->types, keyword))
+                    style = SMALLTALK_STYLE_TYPE;
+                else
+                    style = SMALLTALK_STYLE_IDENTIFIER;
+                break;
+            }
+            if (qe_isdigit(c)) {
+                /* parse numbers */
+                int value = 0;
+
+                while (qe_isdigit(str[i])) {
+                    value = value * 10 + str[i++] - '0';
+                }
+                if (qe_findchar("rR", str[i]) && qe_inrange(value, 2, 36)) {
+                    i++;
+                    while (qe_basedigit(str[i]) < value)
+                        i++;
+                } else {
+                    if (qe_isdigit(str[i]) == '.' && qe_isdigit(str[i+1])) {
+                        i += 2;
+                        while (qe_isdigit(str[i]))
+                            i++;
+                    }
+                    if (qe_findchar("eE", str[i])) {
+                        int j = i + 1;
+                        if (qe_findchar("+-", str[j]))
+                            j++;
+                        if (qe_isdigit(str[j])) {
+                            i = j + 1;
+                            while (qe_isdigit(str[i]))
+                                i++;
+                        }
+                    }
+                }
+                style = SMALLTALK_STYLE_NUMBER;
+                break;
+            }
+            continue;
+        }
+        SET_COLOR(str, start, i, style);
+        style = 0;
+    }
+    cp->colorize_state = state;
+}
+
+static int smalltalk_mode_probe(ModeDef *mode, ModeProbeData *pd)
+{
+    const char *p = cs8(pd->buf);
+
+    if (match_extension(pd->filename, mode->extensions)) {
+        if (*p == '"' || *p == '\'')
+            return 80;
+        else
+            return 51;
+    }
+
+    while (qe_isspace(*p))
+        p++;
+
+    if (*p == '!') {
+        while (*++p && p[1] != '\r' && p[1] != '\n')
+            p++;
+        if (*p == '!')
+            return 60;
+    }
+    return 1;
+}
+
+static ModeDef smalltalk_mode = {
+    .name = "Smalltalk",
+    .extensions = "st|sts|sources|changes",
+    .mode_probe = smalltalk_mode_probe,
+    .keywords = smalltalk_keywords,
+    .types = smalltalk_types,
+    .colorize_func = smalltalk_colorize_line,
+};
+
+static int smalltalk_init(void)
+{
+    qe_register_mode(&smalltalk_mode, MODEF_SYNTAX);
+
+    return 0;
+}
+
 /*----------------*/
 
 static int extra_modes_init(void)
@@ -3953,6 +4128,7 @@
     ocaml_init();
     emf_init();
     agena_init();
+    smalltalk_init();
     return 0;
 }
 



reply via email to

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