qemacs-commit
[Top][All Lists]
Advanced

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

[Qemacs-commit] qemacs parser.c qe.c qe.h


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs parser.c qe.c qe.h
Date: Tue, 11 Aug 2015 22:15:39 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        15/08/11 22:15:39

Modified files:
        .              : parser.c qe.c qe.h 

Log message:
        config script: added new commands
        
        - add eval-expression(expression) on M-:
        - add eval-buffer()
        - add eval-region()
        - add +load <file> command line option to load a script file
        - add +eval <expression> command line option to execute commands
          This can be used to benchmark load time:
          time qe `find . -name "*.[ch]"` +eval 'exit_qemacs(0)'

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/parser.c?cvsroot=qemacs&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.c?cvsroot=qemacs&r1=1.194&r2=1.195
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.191&r2=1.192

Patches:
Index: parser.c
===================================================================
RCS file: /sources/qemacs/qemacs/parser.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- parser.c    3 Feb 2014 20:03:07 -0000       1.2
+++ parser.c    11 Aug 2015 22:15:38 -0000      1.3
@@ -82,11 +82,46 @@
     return res;
 }
 
-int parse_config_file(EditState *s, const char *filename)
+typedef struct QEmacsDataSource {
+    const char *filename;
+    FILE *f;
+    EditBuffer *b;
+    const char *str;
+    int line_num;
+    int pos, len;
+    int offset, stop;
+} QEmacsDataSource;
+
+static char *data_gets(QEmacsDataSource *ds, char *buf, int size)
+{
+    if (ds->f) {
+        return fgets(buf, size, ds->f);
+    }
+    if (ds->b) {
+        /* buffer should not be modified during parse! */
+        if (ds->offset < ds->stop && ds->offset < ds->b->total_size) {
+            eb_get_strline(ds->b, buf, size, &ds->offset);
+            return buf;
+        }
+        return NULL;
+    }
+    if (ds->str) {
+        int i;
+        for (i = 0; i < size - 1; i++) {
+            if (ds->pos >= ds->len
+            ||  (buf[i] = ds->str[ds->pos++]) == '\n')
+                break;
+        }
+        buf[i] = '\0';
+        return i ? buf : NULL;
+    }
+    return NULL;
+}
+
+static int qe_parse_script(EditState *s, QEmacsDataSource *ds)
 {
     QEmacsState *qs = s->qe_state;
     QErrorContext ec;
-    FILE *f;
     char line[1024], str[1024];
     char prompt[64], cmd[128], *q, *strp;
     const char *p, *r;
@@ -96,19 +131,16 @@
     CmdArg args[MAX_CMD_ARGS];
     unsigned char args_type[MAX_CMD_ARGS];
 
-    f = fopen(filename, "r");
-    if (!f)
-        return -1;
     ec = qs->ec;
     skip = 0;
-    line_num = 0;
+    line_num = ds->line_num;
     /* Should parse whole config file in a single read, or load it via
      * a buffer */
     for (;;) {
-        if (fgets(line, sizeof(line), f) == NULL)
+        if (data_gets(ds, line, sizeof(line)) == NULL)
             break;
         line_num++;
-        qs->ec.filename = filename;
+        qs->ec.filename = ds->filename;
         qs->ec.function = NULL;
         qs->ec.lineno = line_num;
 
@@ -297,8 +329,85 @@
     fail:
         ;
     }
-    fclose(f);
     qs->ec = ec;
 
     return 0;
 }
+
+int parse_config_file(EditState *s, const char *filename)
+{
+    QEmacsDataSource ds = { 0 };
+    int res;
+
+    ds.filename = filename;
+    ds.f = fopen(filename, "r");
+    if (!ds.f)
+        return -1;
+    res = qe_parse_script(s, &ds);
+    fclose(ds.f);
+    return res;
+}
+
+void do_eval_expression(EditState *s, const char *expression)
+{
+    QEmacsDataSource ds = { 0 };
+
+    ds.filename = "<string>";
+    ds.str = expression;
+    ds.len = strlen(expression);
+    qe_parse_script(s, &ds);
+}
+
+static int do_eval_buffer_region(EditState *s, int start, int stop)
+{
+    QEmacsDataSource ds = { 0 };
+
+    ds.filename = s->b->name;
+    ds.b = s->b;
+    if (stop < 0)
+        stop = INT_MAX;
+    if (start < 0)
+        start = INT_MAX;
+    if (start < stop) {
+        ds.offset = start;
+        ds.stop = stop;
+    } else {
+        ds.offset = stop;
+        ds.stop = start;
+    }
+    return qe_parse_script(s, &ds);
+}
+
+void do_eval_region(EditState *s)
+{
+    /* deactivate region hilite */
+    s->region_style = 0;
+
+    do_eval_buffer_region(s, s->b->mark, s->offset);
+}
+
+void do_eval_buffer(EditState *s)
+{
+    do_eval_buffer_region(s, 0, -1);
+}
+
+static CmdDef parser_commands[] = {
+
+    CMD2( KEY_META(':'), KEY_NONE,
+          "eval-expression", do_eval_expression, ESs,
+          "s{Eval: }|expression|")
+    CMD0( KEY_NONE, KEY_NONE,
+          "eval-region", do_eval_region)
+    CMD0( KEY_NONE, KEY_NONE,
+          "eval-buffer", do_eval_buffer)
+
+    CMD_DEF_END,
+};
+
+static int parser_init(void)
+{
+    qe_register_cmd_table(parser_commands, NULL);
+    return 0;
+}
+
+qe_module_init(parser_init);

Index: qe.c
===================================================================
RCS file: /sources/qemacs/qemacs/qe.c,v
retrieving revision 1.194
retrieving revision 1.195
diff -u -b -r1.194 -r1.195
--- qe.c        11 Aug 2015 17:45:30 -0000      1.194
+++ qe.c        11 Aug 2015 22:15:38 -0000      1.195
@@ -8250,16 +8250,31 @@
     do_refresh(s);
 
     /* load file(s) */
-    for (i = _optind; i < argc; i++) {
-        int line_num = 0;
-
-        if (argv[i][0] == '+' && i + 1 < argc) {
-            /* Handle +linenumber before file */
-            line_num = atoi(argv[i++]);
+    for (i = _optind; i < argc; ) {
+        int line_num = 0, col_num = 0;
+        char *arg, *p;
+
+        arg = argv[i++];
+
+        if (*arg == '+' && i < argc) {
+            if (strequal(arg, "+eval")) {
+                do_eval_expression(s, argv[i++]);
+                continue;
+            }
+            if (strequal(arg, "+load")) {
+                /* load script file */
+                parse_config_file(s, argv[i++]);
+                continue;
+            }
+            /* Handle +linenumber[,column] before file */
+            line_num = strtol(arg + 1, &p, 10);
+            if (*p == ',')
+                col_num = strtol(p + 1, NULL, 10);
+            arg = argv[i++];
         }
-        do_find_file(s, argv[i], 0);
+        do_find_file(s, arg, 0);
         if (line_num)
-            do_goto_line(qs->active_window, line_num, 1);
+            do_goto_line(qs->active_window, line_num, col_num);
     }
 
 #if !defined(CONFIG_TINY) && !defined(CONFIG_WIN32)

Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.191
retrieving revision 1.192
diff -u -b -r1.191 -r1.192
--- qe.h        11 Aug 2015 17:45:30 -0000      1.191
+++ qe.h        11 Aug 2015 22:15:38 -0000      1.192
@@ -1957,7 +1957,6 @@
 void window_resize(EditState *s, int target_w, int target_h);
 void wheel_scroll_up_down(EditState *s, int dir);
 void qe_mouse_event(QEEvent *ev);
-int parse_config_file(EditState *s, const char *filename);
 int parse_command_line(int argc, char **argv);
 void set_user_option(const char *user);
 void set_tty_charset(const char *name);
@@ -1966,7 +1965,7 @@
 
 int parse_config_file(EditState *s, const char *filename);
 void do_eval_expression(EditState *s, const char *expression);
-void do_eval_region(EditState *s);
+void do_eval_region(EditState *s); /* should pass actual offsets */
 void do_eval_buffer(EditState *s);
 
 /* extras.c */



reply via email to

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