EditBuffer *new_shell_buffer(const char *name, const char *path, const char **argv, int is_shell) { ShellState *s; EditBuffer *b, *b_color; b = eb_new("", BF_SAVELOG); if (!b) return NULL; set_buffer_name(b, name); /* ensure that the name is unique */ eb_set_charset(b, &charset_vt100); s = malloc(sizeof(ShellState)); if (!s) { eb_free(b); return NULL; } memset(s, 0, sizeof(ShellState)); b->priv_data = s; b->close = shell_close; eb_add_callback(b, eb_offset_callback, &s->cur_offset); s->b = b; s->pty_fd = -1; s->pid = -1; s->is_shell = is_shell; s->qe_state = &qe_state; tty_init(s); /* add color buffer */ if (is_shell) { b_color = eb_new("*color*", BF_SYSTEM); if (!b_color) { eb_free(b); free(s); return NULL; } /* no undo info in this color buffer */ b_color->save_log = 0; eb_add_callback(b, shell_color_callback, s); s->b_color = b_color; } /* launch shell */ if (run_process(path, argv, &s->pty_fd, &s->pid) < 0) { eb_free(b); return NULL; } set_read_handler(s->pty_fd, shell_read_cb, s); set_pid_handler(s->pid, shell_pid_cb, s); return b; }
EditBuffer *eb_new(const char *name, int flags) { QEmacsState *qs = &qe_state; EditBuffer *b; b = malloc(sizeof(EditBuffer)); if (!b) return NULL; memset(b, 0, sizeof(EditBuffer)); pstrcpy(b->name, sizeof(b->name), name); b->flags = flags; /* set default data type */ b->data_type = &raw_data_type; /* XXX: suppress save_log and always use flag ? */ b->save_log = ((flags & BF_SAVELOG) != 0); /* add buffer in global buffer list */ b->next = qs->first_buffer; qs->first_buffer = b; /* CG: default charset should be selectable */ //eb_set_charset(b, &charset_8859_1); eb_set_charset(b, &charset_utf8); /* add mark move callback */ eb_add_callback(b, eb_offset_callback, &b->mark); if (!strcmp(name, "*trace*")) trace_buffer = b; return b; }