[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 */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs parser.c qe.c qe.h,
Charlie Gordon <=