wc_ces_list * wc_get_ces_list(void) { wc_ces_info *info; size_t n; if (list) return list; for (info = WcCesInfo, n = 0; info->id; info++) { if (info->name != NULL) n++; } list = New_N(wc_ces_list, n + 1); for (info = WcCesInfo, n = 0; info->id; info++) { if (info->name != NULL) { list[n].id = info->id; list[n].name = info->name; list[n].desc = info->desc; n++; } } list[n].id = 0; list[n].name = NULL; list[n].desc = NULL; qsort(list, n, sizeof(wc_ces_list), wc_ces_list_cmp); return list; }
void setupscreen(void) { int i; if (LINES + 1 > max_LINES) { max_LINES = LINES + 1; max_COLS = 0; ScreenElem = New_N(Screen, max_LINES); ScreenImage = New_N(Screen *, max_LINES); }
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; }
static int form_update_line(Line *line, char **str, int spos, int epos, int width, int newline, int password) { int c_len = 1, c_width = 1, w, i, len, pos; char *p, *buf; Lineprop c_type, effect, *prop; for (p = *str, w = 0, pos = 0; *p && w < width;) { c_type = get_mctype((unsigned char *)p); #ifdef USE_M17N c_len = get_mclen(p); c_width = get_mcwidth(p); #endif if (c_type == PC_CTRL) { if (newline && *p == '\n') break; if (*p != '\r') { w++; pos++; } } else if (password) { #ifdef USE_M17N if (w + c_width > width) break; #endif w += c_width; pos += c_width; #ifdef USE_M17N } else if (c_type & PC_UNKNOWN) { w++; pos++; } else { if (w + c_width > width) break; #endif w += c_width; pos += c_len; } p += c_len; } pos += width - w; len = line->len + pos + spos - epos; buf = New_N(char, len); prop = New_N(Lineprop, len); memmove((void *)buf, (void *)line->lineBuf, spos * sizeof(char)); memmove((void *)prop, (void *)line->propBuf, spos * sizeof(Lineprop)); effect = CharEffect(line->propBuf[spos]); for (p = *str, w = 0, pos = spos; *p && w < width;) { c_type = get_mctype((unsigned char *)p); #ifdef USE_M17N c_len = get_mclen(p); c_width = get_mcwidth(p); #endif if (c_type == PC_CTRL) { if (newline && *p == '\n') break; if (*p != '\r') { buf[pos] = password ? '*' : ' '; prop[pos] = effect | PC_ASCII; pos++; w++; } } else if (password) { #ifdef USE_M17N if (w + c_width > width) break; #endif for (i = 0; i < c_width; i++) { buf[pos] = '*'; prop[pos] = effect | PC_ASCII; pos++; w++; } #ifdef USE_M17N } else if (c_type & PC_UNKNOWN) { buf[pos] = ' '; prop[pos] = effect | PC_ASCII; pos++; w++; } else { if (w + c_width > width) break; #else } else { #endif buf[pos] = *p; prop[pos] = effect | c_type; pos++; #ifdef USE_M17N c_type = (c_type & ~PC_WCHAR1) | PC_WCHAR2; for (i = 1; i < c_len; i++) { buf[pos] = p[i]; prop[pos] = effect | c_type; pos++; } #endif w += c_width; } p += c_len; }