static int org_find_heading(EditState *s, int offset, int *level, int silent) { int offset1, nb, c; offset = eb_goto_bol(s->b, offset); for (;;) { /* Find line starting with '*' */ /* XXX: should ignore blocks using colorstate */ if (eb_nextc(s->b, offset, &offset1) == '*') { for (nb = 1; (c = eb_nextc(s->b, offset1, &offset1)) == '*'; nb++) continue; if (c == ' ') { *level = nb; return offset; } } if (offset == 0) break; offset = eb_prev_line(s->b, offset); } if (!silent) put_status(s, "Before first heading"); return -1; }
static int shell_get_colorized_line(EditState *e, unsigned int *buf, int buf_size, int offset, int line_num) { EditBuffer *b = e->b; ShellState *s = b->priv_data; EditBuffer *b_color = s->b_color; int color, offset1, c; unsigned int *buf_ptr, *buf_end; unsigned char buf1[1]; /* record line */ buf_ptr = buf; buf_end = buf + buf_size; for (;;) { eb_read(b_color, offset, buf1, 1); color = buf1[0]; c = eb_nextc(b, offset, &offset1); if (c == '\n') break; if (buf_ptr < buf_end) { /* XXX: test */ if (color != s->def_color) { c |= (QE_STYLE_TTY | color) << STYLE_SHIFT; } *buf_ptr++ = c; } offset = offset1; } return buf_ptr - buf; }
/* XXX: optimize !!!!! */ static void tty_gotoxy(ShellState *s, int x, int y) { int total_lines, line_num, col_num, offset, offset1, c; unsigned char buf1[10]; /* compute offset */ eb_get_pos(s->b, &total_lines, &col_num, s->b->total_size); line_num = total_lines - TTY_YSIZE; if (line_num < 0) line_num = 0; line_num += y; /* add lines if necessary */ while (line_num >= total_lines) { buf1[0] = '\n'; eb_insert(s->b, s->b->total_size, buf1, 1); total_lines++; } offset = eb_goto_pos(s->b, line_num, 0); for(;x > 0; x--) { c = eb_nextc(s->b, offset, &offset1); if (c == '\n') { buf1[0] = ' '; for(;x > 0; x--) { eb_insert(s->b, offset, buf1, 1); } break; } else { offset = offset1; } } s->cur_offset = offset; }
int eb_next_line(EditBuffer *b, int offset) { int c; for (;;) { c = eb_nextc(b, offset, &offset); if (c == '\n') break; } return offset; }
int eb_is_empty_line(EditBuffer *b, int offset) { int c; for (;;) { c = eb_nextc(b, offset, &offset); if (c == '\n') return 1; if (!isspace(c)) break; } return 0; }
static int org_prev_heading(EditState *s, int offset, int target, int *level) { int offset1, nb, c; for (;;) { if (offset == 0) { nb = 0; break; } offset = eb_prev_line(s->b, offset); /* XXX: should ignore blocks using colorstate */ if (eb_nextc(s->b, offset, &offset1) == '*') { for (nb = 1; (c = eb_nextc(s->b, offset1, &offset1)) == '*'; nb++) continue; if (c == ' ' && nb <= target) { break; } } } if (level) *level = nb; return offset; }
int eb_goto_pos(EditBuffer *b, int line1, int col1) { Page *p, *p_end; int line2, col2, line, col, offset, offset1; u8 *q, *q_end; line = 0; col = 0; offset = 0; p = b->page_table; p_end = b->page_table + b->nb_pages; while (p < p_end) { if (!(p->flags & PG_VALID_POS)) { p->flags |= PG_VALID_POS; get_pos(p->data, p->size, &p->nb_lines, &p->col, &b->charset_state); } line2 = line + p->nb_lines; if (p->nb_lines) col2 = 0; col2 = col + p->col; if (line2 > line1 || (line2 == line1 && col2 >= col1)) { /* compute offset */ q = p->data; q_end = p->data + p->size; /* seek to the correct line */ while (line < line1) { col = 0; q = memchr(q, '\n', q_end - q); q++; line++; } /* test if we want to go after the end of the line */ offset += q - p->data; while (col < col1 && eb_nextc(b, offset, &offset1) != '\n') { col++; offset = offset1; } return offset; } line = line2; col = col2; offset += p->size; p++; } return b->total_size; }
/* get the line starting at offset 'offset' */ int eb_get_line(EditBuffer *b, unsigned int *buf, int buf_size, int *offset_ptr) { int c; unsigned int *buf_ptr, *buf_end; int offset; offset = *offset_ptr; /* record line */ buf_ptr = buf; buf_end = buf + buf_size; for (;;) { c = eb_nextc(b, offset, &offset); if (c == '\n') break; if (buf_ptr < buf_end) *buf_ptr++ = c; } *offset_ptr = offset; return buf_ptr - buf; }
static int xml_parse_internal(XMLState *s, const char *buf_start, int buf_len, EditBuffer *b, int offset_start) { int ch, offset, offset0, text_offset_start, ret, offset_end; const char *buf_end, *buf; buf = buf_start; buf_end = buf + buf_len; offset = offset_start; offset_end = offset_start + buf_len; offset0 = 0; /* not used */ text_offset_start = 0; /* not used */ for (;;) { if (buf) { if (buf >= buf_end) break; ch = charset_decode(&s->charset_state, &buf); } else { if (offset >= offset_end) break; offset0 = offset; ch = eb_nextc(b, offset, &offset); } /* increment line number to signal errors */ if (ch == '\n') { /* well, should add counter, but we test abort here */ if (s->abort_func(s->abort_opaque)) return -1; s->line_num++; } switch (s->state) { case XML_STATE_TAG: if (ch == '>') { strbuf_addch(&s->str, '\0'); ret = parse_tag(s, (char *)s->str.buf); switch (ret) { default: case XML_STATE_TEXT: xml_text: strbuf_reset(&s->str); s->state = XML_STATE_TEXT; text_offset_start = offset; break; case XML_STATE_PRETAG: strbuf_reset(&s->str); s->state = XML_STATE_PRETAG; text_offset_start = offset; break; } } else { strbuf_addch(&s->str, ch); /* test comment */ if (s->str.size == 3 && s->str.buf[0] == '!' && s->str.buf[1] == '-' && s->str.buf[2] == '-') { s->state = XML_STATE_COMMENT; } } break; case XML_STATE_TEXT: if (ch == '<') { /* XXX: not strictly correct with comments : should not flush if comment */ if (buf) { strbuf_addch(&s->str, '\0'); flush_text(s, (char *)s->str.buf); strbuf_reset(&s->str); } else { flush_text_buffer(s, text_offset_start, offset0); } s->state = XML_STATE_TAG; } else { if (buf) { /* evaluate entities */ if (ch == '&') { buf--; ch = parse_entity(&buf); } strbuf_addch(&s->str, ch); } } break; case XML_STATE_COMMENT: if (ch == '-') s->state = XML_STATE_COMMENT1; break; case XML_STATE_COMMENT1: if (ch == '-') s->state = XML_STATE_COMMENT2; else s->state = XML_STATE_COMMENT; break; case XML_STATE_COMMENT2: if (ch == '>') { goto xml_text; } else if (ch != '-') { s->state = XML_STATE_COMMENT; } break; case XML_STATE_PRETAG: { int len, taglen; strbuf_addch(&s->str, ch); taglen = s->pretaglen + 2; len = s->str.size - taglen; if (len >= 0 && s->str.buf[len] == '<' && s->str.buf[len + 1] == '/' && !xml_tagcmp((char *)s->str.buf + len + 2, s->pretag)) { s->str.buf[len] = '\0'; if (!xml_tagcmp(s->pretag, "style")) { if (s->style_sheet) { CSSParseState b1, *b = &b1; b->ptr = (char *)s->str.buf; b->line_num = s->line_num; /* XXX: incorrect */ b->filename = s->filename; b->ignore_case = s->ignore_case; css_parse_style_sheet(s->style_sheet, b); } } else if (!xml_tagcmp(s->pretag, "script")) { /* XXX: handle script */ } else { /* just add the content */ if (buf) { flush_text(s, (char *)s->str.buf); } else { /* XXX: would be incorrect if non ascii chars */ flush_text_buffer(s, text_offset_start, offset - taglen); } strbuf_reset(&s->str); if (s->box) s->box = s->box->parent; } s->state = XML_STATE_WAIT_EOT; } } break; case XML_STATE_WAIT_EOT: /* wait end of tag */ if (ch == '>') goto xml_text; break; } } return buf - buf_start; }
static void tty_emulate(ShellState *s, int c) { int i, offset, offset1, offset2, n; char buf1[10]; #define ESC2(c1,c2) (((c1)<<8)|((unsigned char)c2)) /* some bytes are state independent */ switch (c) { case 0x18: case 0x1A: s->state = TTY_STATE_NORM; return; case 0x1B: s->state = TTY_STATE_ESC; return; #if 0 case 0x9B: goto csi_entry; #endif } switch (s->state) { case TTY_STATE_NORM: switch (c) { /* BEL Bell (Ctrl-G) */ /* FF Form Feed or New Page (NP) (Ctrl-L) same as LF */ /* TAB Horizontal Tab (HT) (Ctrl-I) */ /* VT Vertical Tab (Ctrl-K) same as LF */ case 8: /* ^H BS = backspace */ { int c1; c1 = eb_prevc(s->b, s->cur_offset, &offset); if (c1 != '\n') s->cur_offset = offset; } break; case 10: /* ^J NL = line feed */ /* go to next line */ /* CG: should check if column should be kept */ offset = s->cur_offset; for (;;) { if (offset == s->b->total_size) { /* add a new line */ buf1[0] = '\n'; eb_insert(s->b, offset, buf1, 1); offset = s->b->total_size; break; } c = eb_nextc(s->b, offset, &offset); if (c == '\n') break; } s->cur_offset = offset; break; case 13: /* ^M CR = carriage return */ /* move to bol */ for (;;) { c = eb_prevc(s->b, s->cur_offset, &offset1); if (c == '\n') break; s->cur_offset = offset1; } break; case 14: /* ^N SO = shift out */ s->shifted = 1; break; case 15: /* ^O SI = shift in */ s->shifted = 0; break; default: if (c >= 32 || c == 9) { int c1, cur_len, len; /* CG: assuming ISO-8859-1 characters */ /* CG: horrible kludge for alternate charset support */ if (s->shifted && c >= 96 && c < 128) c += 32; /* write char (should factorize with do_char() code */ len = unicode_to_charset(buf1, c, s->b->charset); c1 = eb_nextc(s->b, s->cur_offset, &offset); /* XXX: handle tab case */ if (c1 == '\n') { /* insert */ eb_insert(s->b, s->cur_offset, buf1, len); } else { cur_len = offset - s->cur_offset; if (cur_len == len) { eb_write(s->b, s->cur_offset, buf1, len); } else { eb_delete(s->b, s->cur_offset, cur_len); eb_insert(s->b, s->cur_offset, buf1, len); } } s->cur_offset += len; } break; } break; case TTY_STATE_ESC: if (c == '[') { for (i = 0; i < MAX_ESC_PARAMS; i++) { s->esc_params[i] = 0; s->has_params[i] = 0; } s->nb_esc_params = 0; s->esc1 = 0; s->state = TTY_STATE_CSI; } else { /* CG: should deal with other sequences: * ansi: hts=\EH, s0ds=\E(B, s1ds=\E)B, s2ds=\E*B, s3ds=\E+B, * linux: hts=\EH, rc=\E8, ri=\EM, rs1=\Ec\E]R, sc=\E7, * vt100: enacs=\E(B\E)0, hts=\EH, rc=\E8, ri=\EM$<5>, * rmkx=\E[?1l\E>, * rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7, * smkx=\E[?1h\E=, * xterm: enacs=\E(B\E)0, hts=\EH, is2=\E[!p\E[?3;4l\E[4l\E>, * rc=\E8, ri=\EM, rmkx=\E[?1l\E>, rs1=\Ec, * rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, smkx=\E[?1h\E=, */ switch (c) { case '(': case ')': case '*': case '+': case ']': s->esc1 = c; s->state = TTY_STATE_ESC2; break; case 'H': // hts case '7': // sc case '8': // rc case 'M': // ri case 'c': // rs1 case '>': // rmkx, is2, rs2 case '=': // smkx // XXX: do these default: s->state = TTY_STATE_NORM; break; } } break; case TTY_STATE_ESC2: s->state = TTY_STATE_NORM; switch (ESC2(s->esc1, c)) { case ESC2('(','B'): case ESC2(')','B'): case ESC2('(','0'): case ESC2(')','0'): case ESC2('*','B'): case ESC2('+','B'): case ESC2(']','R'): /* XXX: ??? */ break; } break; case TTY_STATE_CSI: if (c == '?') { s->esc1 = c; break; } if (c >= '0' && c <= '9') { if (s->nb_esc_params < MAX_ESC_PARAMS) { s->esc_params[s->nb_esc_params] = s->esc_params[s->nb_esc_params] * 10 + c - '0'; s->has_params[s->nb_esc_params] = 1; } } else { s->nb_esc_params++; if (c == ';') break; s->state = TTY_STATE_NORM; switch (ESC2(s->esc1,c)) { case ESC2('?','h'): /* set terminal mode */ /* 1047, 1048 -> cup mode: * xterm 1049 private mode, * should grab all keys while active! */ if (s->esc_params[0] == 1047 || s->esc_params[0] == 1048 || s->esc_params[0] == 1049) { s->grab_keys = 1; qe_grab_keys(shell_key, s); /* Should also clear screen */ } break; case ESC2('?','l'): /* reset terminal mode */ if (s->esc_params[0] == 1047 || s->esc_params[0] == 1048 || s->esc_params[0] == 1049) { qe_ungrab_keys(); s->grab_keys = 0; } break; case 'A': /* move relative up */ tty_gotoxy(s, 0, -(s->esc_params[0] + 1 - s->has_params[0]), 1); break; case 'B': /* move relative down */ tty_gotoxy(s, 0, (s->esc_params[0] + 1 - s->has_params[0]), 1); break; case 'C': /* move relative forward */ tty_gotoxy(s, (s->esc_params[0] + 1 - s->has_params[0]), 0, 1); break; case 'D': /* move relative backward */ tty_gotoxy(s, -(s->esc_params[0] + 1 - s->has_params[0]), 0, 1); break; case 'H': /* goto xy */ tty_gotoxy(s, s->esc_params[1] - s->has_params[1], s->esc_params[0] - s->has_params[0], 0); break; case 'J': /* clear to end of screen */ case 'L': /* insert lines */ case 'M': /* delete lines */ case 'S': /* scroll forward P lines */ case 'T': /* scroll back P lines */ case 'X': /* erase P characters */ break; case 'K': /* clear eol (parm=1 -> bol) */ offset1 = s->cur_offset; for (;;) { c = eb_nextc(s->b, offset1, &offset2); if (c == '\n') break; offset1 = offset2; } eb_delete(s->b, s->cur_offset, offset1 - s->cur_offset); break; case 'P': /* delete chars */ n = s->esc_params[0]; if (n <= 0) n = 1; offset1 = s->cur_offset; for (; n > 0; n--) { c = eb_nextc(s->b, offset1, &offset2); if (c == '\n') break; offset1 = offset2; } eb_delete(s->b, s->cur_offset, offset1 - s->cur_offset); break; case '@': /* insert chars */ n = s->esc_params[0]; if (n <= 0) n = 1; buf1[0] = ' '; for (; n > 0; n--) { eb_insert(s->b, s->cur_offset, buf1, 1); } break; case 'm': /* colors */ n = s->nb_esc_params; if (n == 0) n = 1; for (i = 0; i < n; i++) tty_csi_m(s, s->esc_params[i]); break; case 'n': if (s->esc_params[0] == 6) { /* XXX: send cursor position, just to be able to launch qemacs in qemacs (in 8859-1) ! */ char buf2[20]; snprintf(buf2, sizeof(buf2), "\033[%d;%dR", 1, 1); tty_write(s, buf2, -1); } break; default: break; } } break; } #undef ESC2 tty_update_cursor(s); }
static void do_compile_error(EditState *s, int dir) { QEmacsState *qs = s->qe_state; EditState *e; EditBuffer *b; int offset, offset1, found_offset; char filename[MAX_FILENAME_SIZE], *q; int line_num, c; /* CG: should have a buffer flag for error source. * first check if current buffer is an error source. * if not, then scan for appropriate error source * in buffer least recently used order */ if ((b = eb_find("*compilation*")) == NULL && (b = eb_find("*shell*")) == NULL && (b = eb_find("*errors*")) == NULL) { put_status(s, "No compilation buffer"); return; } /* find next/prev error */ offset = error_offset; if (offset < 0) { offset = 0; goto find_error; } for (;;) { if (dir > 0) { if (offset >= b->total_size) { put_status(s, "No more errors"); return; } for (;;) { c = eb_nextc(b, offset, &offset); if (c == '\n') break; } } else { if (offset <= 0) { put_status(s, "No previous error"); return; } eb_prevc(b, offset, &offset); for (;;) { c = eb_prevc(b, offset, &offset1); if (c == '\n') break; offset = offset1; } } find_error: found_offset = offset; /* extract filename */ q = filename; for (;;) { c = eb_nextc(b, offset, &offset); if (c == '\n' || c == '\t' || c == ' ') goto next_line; if (c == ':') break; if ((q - filename) < (int)sizeof(filename) - 1) *q++ = c; } *q = '\0'; /* extract line number */ line_num = 0; for (;;) { c = eb_nextc(b, offset, &offset); if (c == ':') break; if (!isdigit(c)) goto next_line; line_num = line_num * 10 + c - '0'; } if (line_num >= 1) { if (line_num != last_line_num || strcmp(filename, last_filename) != 0) { last_line_num = line_num; pstrcpy(last_filename, sizeof(last_filename), filename); break; } } next_line: offset = found_offset; } error_offset = found_offset; /* update offsets */ for (e = qs->first_window; e != NULL; e = e->next_window) { if (e->b == b) { e->offset = error_offset; } } /* CG: Should remove popups, sidepanes, helppanes... */ /* go to the error */ do_load(s, filename); do_goto_line(s, line_num); }
void hex_write_char(EditState *s, int key) { unsigned int cur_ch, ch; int hsize, shift, cur_len, len, h; char buf[10]; if (s->hex_mode) { if (s->unihex_mode) hsize = 4; else hsize = 2; h = to_hex(key); if (h < 0) return; if (s->insert && s->hex_nibble == 0) { ch = h << ((hsize - 1) * 4); if (s->unihex_mode) { len = unicode_to_charset(buf, ch, s->b->charset); } else { len = 1; buf[0] = ch; } eb_insert(s->b, s->offset, buf, len); } else { if (s->unihex_mode) { cur_ch = eb_nextc(s->b, s->offset, &cur_len); cur_len -= s->offset; } else { eb_read(s->b, s->offset, buf, 1); cur_ch = buf[0]; cur_len = 1; } shift = (hsize - s->hex_nibble - 1) * 4; ch = (cur_ch & ~(0xf << shift)) | (h << shift); if (s->unihex_mode) { len = unicode_to_charset(buf, ch, s->b->charset); } else { len = 1; buf[0] = ch; } #if 1 eb_replace(s->b, s->offset, cur_len, buf, len); #else if (cur_len == len) { eb_write(s->b, s->offset, buf, len); } else { eb_delete(s->b, s->offset, cur_len); eb_insert(s->b, s->offset, buf, len); } #endif } if (++s->hex_nibble == hsize) { s->hex_nibble = 0; if (s->offset < s->b->total_size) s->offset += len; } } else { text_write_char(s, key); } }
static void do_compile_error(EditState *s, int dir) { QEmacsState *qs = &qe_state; EditState *e; EditBuffer *b; int offset, offset1, found_offset; char filename[1024], *q; int line_num, c; b = eb_find("*compilation*"); if (!b) { b = eb_find("*shell*"); if (!b) { put_status(s, "No compilation buffer"); return; } } /* find next/prev error */ offset = error_offset; if (offset < 0) { offset = 0; goto find_error; } for(;;) { if (dir > 0) { if (offset >= b->total_size) { put_status(s, "No more errors"); return; } for(;;) { c = eb_nextc(b, offset, &offset); if (c == '\n') break; } } else { if (offset <= 0) { put_status(s, "No previous error"); return; } eb_prevc(b, offset, &offset); for(;;) { c = eb_prevc(b, offset, &offset1); if (c == '\n') break; offset = offset1; } } find_error: found_offset = offset; /* extract filename */ q = filename; for(;;) { c = eb_nextc(b, offset, &offset); if (c == '\n' || c == '\t' || c == ' ') goto next_line; if (c == ':') break; if ((q - filename) < sizeof(filename) - 1) *q++ = c; } *q = '\0'; /* extract line number */ line_num = 0; for(;;) { c = eb_nextc(b, offset, &offset); if (c == ':') break; if (!isdigit(c)) goto next_line; line_num = line_num * 10 + c - '0'; } if (line_num >= 1) { if (line_num != last_line_num || strcmp(filename, last_filename) != 0) { last_line_num = line_num; pstrcpy(last_filename, sizeof(last_filename), filename); break; } } next_line: offset = found_offset; } error_offset = found_offset; /* update offsets */ for(e = qs->first_window; e != NULL; e = e->next_window) { if (e->b == b) { e->offset = error_offset; } } /* go to the error */ do_load(s, filename); do_goto_line(s, line_num); }
static void tty_emulate(ShellState *s, int c) { int i, offset, offset1, offset2, n; unsigned char buf1[10]; switch(s->state) { case TTY_STATE_NORM: switch(c) { case 8: { int c1; c1 = eb_prevc(s->b, s->cur_offset, &offset); if (c1 != '\n') s->cur_offset = offset; } break; case 10: /* go to next line */ offset = s->cur_offset; for(;;) { if (offset == s->b->total_size) { /* add a new line */ buf1[0] = '\n'; eb_insert(s->b, offset, buf1, 1); offset = s->b->total_size; break; } c = eb_nextc(s->b, offset, &offset); if (c == '\n') break; } s->cur_offset = offset; break; case 13: /* move to bol */ for(;;) { c = eb_prevc(s->b, s->cur_offset, &offset1); if (c == '\n') break; s->cur_offset = offset1; } break; case 27: s->state = TTY_STATE_ESC; break; default: if (c >= 32 || c == 9) { int c1, cur_len, len; /* write char (should factorize with do_char() code */ len = unicode_to_charset(buf1, c, s->b->charset); c1 = eb_nextc(s->b, s->cur_offset, &offset); /* XXX: handle tab case */ if (c1 == '\n') { /* insert */ eb_insert(s->b, s->cur_offset, buf1, len); } else { cur_len = offset - s->cur_offset; if (cur_len == len) { eb_write(s->b, s->cur_offset, buf1, len); } else { eb_delete(s->b, s->cur_offset, cur_len); eb_insert(s->b, s->cur_offset, buf1, len); } } s->cur_offset += len; } break; } break; case TTY_STATE_ESC: if (c == '[') { for(i=0;i<MAX_ESC_PARAMS;i++) s->esc_params[i] = 0; s->nb_esc_params = 0; s->state = TTY_STATE_CSI; } else { s->state = TTY_STATE_NORM; } break; case TTY_STATE_CSI: if (c >= '0' && c <= '9') { if (s->nb_esc_params < MAX_ESC_PARAMS) { s->esc_params[s->nb_esc_params] = s->esc_params[s->nb_esc_params] * 10 + c - '0'; } } else { s->nb_esc_params++; if (c == ';') break; s->state = TTY_STATE_NORM; switch(c) { case 'H': /* goto xy */ { int x, y; y = s->esc_params[0] - 1; x = s->esc_params[1] - 1; if (y < 0) y = 0; else if (y >= TTY_YSIZE) y = TTY_YSIZE - 1; if (x < 0) x = 0; tty_gotoxy(s, x, y); } break; case 'K': /* clear to eol */ offset1 = s->cur_offset; for(;;) { c = eb_nextc(s->b, offset1, &offset2); if (c == '\n') break; offset1 = offset2; } eb_delete(s->b, s->cur_offset, offset1 - s->cur_offset); break; case 'P': /* delete chars */ n = s->esc_params[0]; if (n <= 0) n = 1; offset1 = s->cur_offset; for(;n > 0;n--) { c = eb_nextc(s->b, offset1, &offset2); if (c == '\n') break; offset1 = offset2; } eb_delete(s->b, s->cur_offset, offset1 - s->cur_offset); break; case '@': /* insert chars */ n = s->esc_params[0]; if (n <= 0) n = 1; buf1[0] = ' '; for(;n > 0;n--) { eb_insert(s->b, s->cur_offset, buf1, 1); } break; case 'm': /* colors */ n = s->nb_esc_params; if (n == 0) n = 1; for(i=0;i<n;i++) tty_csi_m(s, s->esc_params[i]); break; case 'n': if (s->esc_params[0] == 6) { /* XXX: send cursor position, just to be able to launch qemacs in qemacs ! */ char buf2[20]; snprintf(buf2, sizeof(buf2), "\033[%d;%dR", 1, 1); tty_write(s, buf2, -1); } break; default: break; } } break; } tty_update_cursor(s); }
static int org_is_header_line(EditState *s, int offset) { /* Check if line starts with '*' */ /* XXX: should ignore blocks using colorstate */ return eb_nextc(s->b, eb_goto_bol(s->b, offset), &offset) == '*'; }