[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();