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; }
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; }
static void do_org_move_subtree(EditState *s, int dir) { int offset, offset1, offset2, level, level1, level2, size; EditBuffer *b1; if (check_read_only(s)) return; if (!org_is_header_line(s, s->offset)) { put_status(s, "Not on header line"); return; } offset = org_find_heading(s, s->offset, &level, 0); if (offset < 0) return; offset1 = org_next_heading(s, offset, level, &level1); size = offset1 - offset; if (dir < 0) { offset2 = org_prev_heading(s, offset, level, &level2); if (level2 < level) { put_status(s, "Cannot move substree"); return; } } else { if (offset1 == s->b->total_size || level1 < level) { put_status(s, "Cannot move substree"); return; } offset2 = org_next_heading(s, offset1, level, &level2); } b1 = eb_new("*tmp*", BF_SYSTEM | (s->b->flags & BF_STYLES)); eb_set_charset(b1, s->b->charset, s->b->eol_type); eb_insert_buffer_convert(b1, 0, s->b, offset, size); eb_delete(s->b, offset, size); if (offset2 > offset) offset2 -= size; eb_insert_buffer_convert(s->b, offset2, b1, 0, b1->total_size); eb_free(&b1); s->offset = offset2; }