HmarkerList * putHmarker(HmarkerList *ml, int line, int pos, int seq) { if (ml == NULL) { ml = New(HmarkerList); ml->marks = NULL; ml->nmark = 0; ml->markmax = 0; ml->prevhseq = -1; } if (ml->markmax == 0) { ml->markmax = FIRST_MARKER_SIZE; ml->marks = NewAtom_N(BufferPoint, ml->markmax); bzero(ml->marks, sizeof(BufferPoint) * ml->markmax); } if (seq + 1 > ml->nmark) ml->nmark = seq + 1; if (ml->nmark >= ml->markmax) { ml->markmax = ml->nmark * 2; ml->marks = New_Reuse(BufferPoint, ml->marks, ml->markmax); } ml->marks[seq].line = line; ml->marks[seq].pos = pos; ml->marks[seq].invalid = 0; return ml; }
AnchorList * putAnchor(AnchorList *al, char *url, char *target, Anchor **anchor_return, char *referer, char *title, unsigned char key, int line, int pos) { int n, i, j; Anchor *a; BufferPoint bp; if (al == NULL) { al = New(AnchorList); al->anchors = NULL; al->nanchor = al->anchormax = 0; al->acache = -1; } if (al->anchormax == 0) { /* first time; allocate anchor buffer */ al->anchors = New_N(Anchor, FIRST_ANCHOR_SIZE); al->anchormax = FIRST_ANCHOR_SIZE; } if (al->nanchor == al->anchormax) { /* need realloc */ al->anchormax *= 2; al->anchors = New_Reuse(Anchor, al->anchors, al->anchormax); } bp.line = line; bp.pos = pos; n = al->nanchor; if (!n || bpcmp(al->anchors[n - 1].start, bp) < 0) i = n; else for (i = 0; i < n; i++) { if (bpcmp(al->anchors[i].start, bp) >= 0) { for (j = n; j > i; j--) al->anchors[j] = al->anchors[j - 1]; break; } } a = &al->anchors[i]; a->url = url; a->target = target; a->referer = referer; a->title = title; a->accesskey = key; a->slave = FALSE; a->start = bp; a->end = bp; al->nanchor++; if (anchor_return) *anchor_return = a; return al; }
void addImage(ImageCache * cache, int x, int y, int sx, int sy, int w, int h) { TerminalImage *i; if (!activeImage) return; if (n_terminal_image >= max_terminal_image) { max_terminal_image = max_terminal_image ? (2 * max_terminal_image) : 8; terminal_image = New_Reuse(TerminalImage, terminal_image, max_terminal_image); } i = &terminal_image[n_terminal_image]; i->cache = cache; i->x = x; i->y = y; i->sx = sx; i->sy = sy; i->width = w; i->height = h; n_terminal_image++; }
Str checkType(Str s, Lineprop **oprop, Linecolor **ocolor) { Lineprop mode; Lineprop effect = PE_NORMAL; Lineprop *prop; static Lineprop *prop_buffer = NULL; static int prop_size = 0; char *str = s->ptr, *endp = &s->ptr[s->length], *bs = NULL; #ifdef USE_ANSI_COLOR Lineprop ceffect = PE_NORMAL; Linecolor cmode = 0; int check_color = FALSE; Linecolor *color = NULL; static Linecolor *color_buffer = NULL; static int color_size = 0; char *es = NULL; #endif int do_copy = FALSE; int i; int plen = 0, clen; if (prop_size < s->length) { prop_size = (s->length > LINELEN) ? s->length : LINELEN; prop_buffer = New_Reuse(Lineprop, prop_buffer, prop_size); } prop = prop_buffer; if (ShowEffect) { bs = memchr(str, '\b', s->length); #ifdef USE_ANSI_COLOR if (ocolor) { es = memchr(str, ESC_CODE, s->length); if (es) { if (color_size < s->length) { color_size = (s->length > LINELEN) ? s->length : LINELEN; color_buffer = New_Reuse(Linecolor, color_buffer, color_size); } color = color_buffer; } } #endif if ((bs != NULL) #ifdef USE_ANSI_COLOR || (es != NULL) #endif ) { char *sp = str, *ep; s = Strnew_size(s->length); do_copy = TRUE; ep = bs ? (bs - 2) : endp; #ifdef USE_ANSI_COLOR if (es && ep > es - 2) ep = es - 2; #endif for (; str < ep && IS_ASCII(*str); str++) { *(prop++) = PE_NORMAL | (IS_CNTRL(*str) ? PC_CTRL : PC_ASCII); #ifdef USE_ANSI_COLOR if (color) *(color++) = 0; #endif } Strcat_charp_n(s, sp, (int)(str - sp)); } } if (!do_copy) { for (; str < endp && IS_ASCII(*str); str++) *(prop++) = PE_NORMAL | (IS_CNTRL(*str) ? PC_CTRL : PC_ASCII); } while (str < endp) { if (prop - prop_buffer >= prop_size) break; if (bs != NULL) { #ifdef USE_M17N if (str == bs - 2 && !strncmp(str, "__\b\b", 4)) { str += 4; effect = PE_UNDER; if (str < endp) bs = memchr(str, '\b', endp - str); continue; } else #endif if (str == bs - 1 && *str == '_') { str += 2; effect = PE_UNDER; if (str < endp) bs = memchr(str, '\b', endp - str); continue; } else if (str == bs) { if (*(str + 1) == '_') { if (s->length) { str += 2; #ifdef USE_M17N for (i = 1; i <= plen; i++) *(prop - i) |= PE_UNDER; #else *(prop - 1) |= PE_UNDER; #endif } else { str++; } } #ifdef USE_M17N else if (!strncmp(str + 1, "\b__", 3)) { if (s->length) { str += (plen == 1) ? 3 : 4; for (i = 1; i <= plen; i++) *(prop - i) |= PE_UNDER; } else { str += 2; } } else if (*(str + 1) == '\b') { if (s->length) { clen = get_mclen(str + 2); if (plen == clen && !strncmp(str - plen, str + 2, plen)) { for (i = 1; i <= plen; i++) *(prop - i) |= PE_BOLD; str += 2 + clen; } else { Strshrink(s, plen); prop -= plen; str += 2; } } else { str += 2; } } #endif else { if (s->length) { #ifdef USE_M17N clen = get_mclen(str + 1); if (plen == clen && !strncmp(str - plen, str + 1, plen)) { for (i = 1; i <= plen; i++) *(prop - i) |= PE_BOLD; str += 1 + clen; } else { Strshrink(s, plen); prop -= plen; str++; } #else if (*(str - 1) == *(str + 1)) { *(prop - 1) |= PE_BOLD; str += 2; } else { Strshrink(s, 1); prop--; str++; } #endif } else { str++; } } if (str < endp) bs = memchr(str, '\b', endp - str); continue; } #ifdef USE_ANSI_COLOR else if (str > bs) bs = memchr(str, '\b', endp - str); #endif } #ifdef USE_ANSI_COLOR if (es != NULL) { if (str == es) { int ok = parse_ansi_color(&str, &ceffect, &cmode); if (str < endp) es = memchr(str, ESC_CODE, endp - str); if (ok) { if (cmode) check_color = TRUE; continue; } } else if (str > es) es = memchr(str, ESC_CODE, endp - str); } #endif plen = get_mclen(str); mode = get_mctype(str) | effect; #ifdef USE_ANSI_COLOR if (color) { *(color++) = cmode; mode |= ceffect; } #endif *(prop++) = mode; #ifdef USE_M17N if (plen > 1) { mode = (mode & ~PC_WCHAR1) | PC_WCHAR2; for (i = 1; i < plen; i++) { *(prop++) = mode; #ifdef USE_ANSI_COLOR if (color) *(color++) = cmode; #endif } if (do_copy) Strcat_charp_n(s, (char *)str, plen); str += plen; } else #endif { if (do_copy) Strcat_char(s, (char)*str); str++; } effect = PE_NORMAL; } *oprop = prop_buffer; #ifdef USE_ANSI_COLOR if (ocolor) *ocolor = check_color ? color_buffer : NULL; #endif return s; }