Str StrmyISgets(InputStream stream) { BaseStream base; StreamBuffer sb; Str s = NULL; int i, len; if (stream == NULL) return '\0'; base = &stream->base; sb = &base->stream; while (!base->iseos) { if (MUST_BE_UPDATED(base)) { do_update(base); } else { if (s && Strlastchar(s) == '\r') { if (sb->buf[sb->cur] == '\n') Strcat_char(s, (char)sb->buf[sb->cur++]); return s; } for (i = sb->cur; i < sb->next && sb->buf[i] != '\n' && sb->buf[i] != '\r'; i++) ; if (i < sb->next) { len = i - sb->cur + 1; if (s == NULL) s = Strnew_size(len + MARGIN_STR_SIZE); Strcat_charp_n(s, (char *)&sb->buf[sb->cur], len); sb->cur = i + 1; if (sb->buf[i] == '\n') return s; } else { if (s == NULL) s = Strnew_size(sb->next - sb->cur + MARGIN_STR_SIZE); Strcat_charp_n(s, (char *)&sb->buf[sb->cur], sb->next - sb->cur); sb->cur = sb->next; } } } if (s == NULL) return Strnew(); return s; }
void Strcat_charp(Str x, char *y) { if (y == NULL) return; Strcat_charp_n(x, y, strlen(y)); }
char * getAnchorText(Buffer *buf, AnchorList *al, Anchor *a) { int hseq, i; Line *l; Str tmp = NULL; char *p, *ep; if (!a || a->hseq < 0) return NULL; hseq = a->hseq; l = buf->firstLine; for (i = 0; i < al->nanchor; i++) { a = &al->anchors[i]; if (a->hseq != hseq) continue; for (; l; l = l->next) { if (l->linenumber == a->start.line) break; } if (!l) break; p = l->lineBuf + a->start.pos; ep = l->lineBuf + a->end.pos; for (; p < ep && IS_SPACE(*p); p++) ; if (p == ep) continue; if (!tmp) tmp = Strnew_size(ep - p); else Strcat_char(tmp, ' '); Strcat_charp_n(tmp, p, ep - p); } return tmp ? tmp->ptr : NULL; }
void Strcat_m_charp(Str x, ...) { va_list ap; char *p; va_start(ap, x); while ((p = va_arg(ap, char *)) != NULL) Strcat_charp_n(x, p, strlen(p)); }
Str StrISgets(InputStream stream) { BaseStream base; StreamBuffer sb; Str s = NULL; uchar *p; int len; if (stream == NULL) return '\0'; base = &stream->base; sb = &base->stream; while (!base->iseos) { if (MUST_BE_UPDATED(base)) { do_update(base); } else { if ((p = memchr(&sb->buf[sb->cur], '\n', sb->next - sb->cur))) { len = p - &sb->buf[sb->cur] + 1; if (s == NULL) s = Strnew_size(len); Strcat_charp_n(s, (char *)&sb->buf[sb->cur], len); sb->cur += len; return s; } else { if (s == NULL) s = Strnew_size(sb->next - sb->cur + MARGIN_STR_SIZE); Strcat_charp_n(s, (char *)&sb->buf[sb->cur], sb->next - sb->cur); sb->cur = sb->next; } } } if (s == NULL) return Strnew(); return s; }
static Anchor * _put_anchor_news(Buffer *buf, char *p1, char *p2, int line, int pos) { Str tmp; if (*p1 == '<') { p1++; if (*(p2 - 1) == '>') p2--; } tmp = Strnew_charp("news:"); Strcat_charp_n(tmp, p1, p2 - p1); return registerHref(buf, url_encode(tmp->ptr, baseURL(buf), buf->document_charset), NULL, NO_REFERER, NULL, '\0', line, pos); }
Str wc_conv_from_viet(Str is, wc_ces ces) { Str os; wc_uchar *sp = (wc_uchar *)is->ptr; wc_uchar *ep = sp + is->length; wc_uchar *p; wc_ccs ccs1 = WcCesInfo[WC_CCS_INDEX(ces)].gset[1].ccs; wc_ccs ccs2 = WcCesInfo[WC_CCS_INDEX(ces)].gset[2].ccs; wc_uint8 *map = NULL; switch (ces) { case WC_CES_TCVN_5712: map = wc_c0_tcvn57122_map; break; case WC_CES_VISCII_11: map = wc_c0_viscii112_map; break; case WC_CES_VPS: map = wc_c0_vps2_map; break; } wc_create_detect_map(ces, WC_FALSE); for (p = sp; p < ep && ! WC_DETECT_MAP[*p]; p++) ; if (p == ep) return is; os = Strnew_size(is->length); if (p > sp) Strcat_charp_n(os, is->ptr, (int)(p - sp)); for (; p < ep; p++) { if (*p & 0x80) wtf_push(os, ccs1, (wc_uint32)*p); else if (*p < 0x20 && map[*p]) wtf_push(os, ccs2, (wc_uint32)*p); else Strcat_char(os, (char)*p); } return os; }
void push_symbol(Str str, char symbol, int width, int n) { char buf[2], *p; int i; #ifdef USE_M17N if (width == 2) p = alt2_symbol[(int)symbol]; else #endif p = alt_symbol[(int)symbol]; for (i = 0; i < 2 && *p; i++, p++) buf[i] = (*p == ' ') ? NBSP_CODE : *p; Strcat(str, Sprintf("<_SYMBOL TYPE=%d>", symbol)); for (; n > 0; n--) Strcat_charp_n(str, buf, i); Strcat_charp(str, "</_SYMBOL>"); }
Str ssl_get_certificate(SSL * ssl, char *hostname) { BIO *bp; X509 *x; X509_NAME *xn; char *p; int len; Str s; char buf[2048]; Str amsg = NULL; Str emsg; char *ans; if (ssl == NULL) return NULL; x = SSL_get_peer_certificate(ssl); if (x == NULL) { if (accept_this_site && strcasecmp(accept_this_site->ptr, hostname) == 0) ans = "y"; else { /* FIXME: gettextize? */ emsg = Strnew_charp("No SSL peer certificate: accept? (y/n)"); ans = inputAnswer(emsg->ptr); } if (ans && TOLOWER(*ans) == 'y') /* FIXME: gettextize? */ amsg = Strnew_charp ("Accept SSL session without any peer certificate"); else { /* FIXME: gettextize? */ char *e = "This SSL session was rejected " "to prevent security violation: no peer certificate"; disp_err_message(e, FALSE); free_ssl_ctx(); return NULL; } if (amsg) disp_err_message(amsg->ptr, FALSE); ssl_accept_this_site(hostname); /* FIXME: gettextize? */ s = amsg ? amsg : Strnew_charp("valid certificate"); return s; } #ifdef USE_SSL_VERIFY /* check the cert chain. * The chain length is automatically checked by OpenSSL when we * set the verify depth in the ctx. */ if (ssl_verify_server) { long verr; if ((verr = SSL_get_verify_result(ssl)) != X509_V_OK) { const char *em = X509_verify_cert_error_string(verr); if (accept_this_site && strcasecmp(accept_this_site->ptr, hostname) == 0) ans = "y"; else { /* FIXME: gettextize? */ emsg = Sprintf("%s: accept? (y/n)", em); ans = inputAnswer(emsg->ptr); } if (ans && TOLOWER(*ans) == 'y') { /* FIXME: gettextize? */ amsg = Sprintf("Accept unsecure SSL session: " "unverified: %s", em); } else { /* FIXME: gettextize? */ char *e = Sprintf("This SSL session was rejected: %s", em)->ptr; disp_err_message(e, FALSE); free_ssl_ctx(); return NULL; } } } #endif emsg = ssl_check_cert_ident(x, hostname); if (emsg != NULL) { if (accept_this_site && strcasecmp(accept_this_site->ptr, hostname) == 0) ans = "y"; else { Str ep = Strdup(emsg); if (ep->length > COLS - 16) Strshrink(ep, ep->length - (COLS - 16)); Strcat_charp(ep, ": accept? (y/n)"); ans = inputAnswer(ep->ptr); } if (ans && TOLOWER(*ans) == 'y') { /* FIXME: gettextize? */ amsg = Strnew_charp("Accept unsecure SSL session:"); Strcat(amsg, emsg); } else { /* FIXME: gettextize? */ char *e = "This SSL session was rejected " "to prevent security violation"; disp_err_message(e, FALSE); free_ssl_ctx(); return NULL; } } if (amsg) disp_err_message(amsg->ptr, FALSE); ssl_accept_this_site(hostname); /* FIXME: gettextize? */ s = amsg ? amsg : Strnew_charp("valid certificate"); Strcat_charp(s, "\n"); xn = X509_get_subject_name(x); if (X509_NAME_get_text_by_NID(xn, NID_commonName, buf, sizeof(buf)) == -1) Strcat_charp(s, " subject=<unknown>"); else Strcat_m_charp(s, " subject=", buf, NULL); xn = X509_get_issuer_name(x); if (X509_NAME_get_text_by_NID(xn, NID_commonName, buf, sizeof(buf)) == -1) Strcat_charp(s, ": issuer=<unknown>"); else Strcat_m_charp(s, ": issuer=", buf, NULL); Strcat_charp(s, "\n\n"); bp = BIO_new(BIO_s_mem()); X509_print(bp, x); len = (int)BIO_ctrl(bp, BIO_CTRL_INFO, 0, (char *)&p); Strcat_charp_n(s, p, len); BIO_free_all(bp); X509_free(x); return s; }
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; }
void Strcat(Str x, Str y) { STR_LENGTH_CHECK(y); Strcat_charp_n(x, y->ptr, y->length); }
Str wc_conv_from_gb18030(Str is, wc_ces ces) { Str os; wc_uchar *sp = (wc_uchar *)is->ptr; wc_uchar *ep = sp + is->length; wc_uchar *p; int state = WC_GB18030_NOSTATE; wc_uint32 gbk; wc_wchar_t cc; #ifdef USE_UNICODE wc_uint32 ucs; #endif for (p = sp; p < ep && *p < 0x80; p++) ; if (p == ep) return is; os = Strnew_size(is->length); if (p > sp) Strcat_charp_n(os, (char *)is->ptr, (int)(p - sp)); for (; p < ep; p++) { switch (state) { case WC_GB18030_NOSTATE: switch (WC_GB18030_MAP[*p]) { case UB: state = WC_GB18030_MBYTE1; break; case C1: wtf_push_unknown(os, p, 1); break; default: Strcat_char(os, (char)*p); break; } break; case WC_GB18030_MBYTE1: if (WC_GB18030_MAP[*p] & LB) { gbk = ((wc_uint32)*(p-1) << 8) | *p; if (wc_gbk_or_gbk_ext(gbk) == WC_CCS_GBK_EXT) wtf_push(os, WC_CCS_GBK_EXT, gbk); else if (*(p-1) >= 0xA1 && *p >= 0xA1) wtf_push(os, wc_gb2312_or_gbk(gbk), gbk); else wtf_push(os, WC_CCS_GBK, gbk); } else if (WC_GB18030_MAP[*p] == L4) { state = WC_GB18030_MBYTE2; break; } else wtf_push_unknown(os, p-1, 2); state = WC_GB18030_NOSTATE; break; case WC_GB18030_MBYTE2: if (WC_GB18030_MAP[*p] == UB) { state = WC_GB18030_MBYTE3; break; } else wtf_push_unknown(os, p-2, 3); state = WC_GB18030_NOSTATE; break; case WC_GB18030_MBYTE3: if (WC_GB18030_MAP[*p] == L4) { cc.ccs = WC_CCS_GB18030_W; cc.code = ((wc_uint32)*(p-3) << 24) | ((wc_uint32)*(p-2) << 16) | ((wc_uint32)*(p-1) << 8) | *p; #ifdef USE_UNICODE if (WcOption.gb18030_as_ucs && (ucs = wc_gb18030_to_ucs(cc)) != WC_C_UCS4_ERROR) wtf_push(os, WC_CCS_GB18030 | (wc_ucs_to_ccs(ucs) & ~WC_CCS_A_SET), cc.code); else #endif wtf_push(os, cc.ccs, cc.code); } else wtf_push_unknown(os, p-3, 4); state = WC_GB18030_NOSTATE; break; } } switch (state) { case WC_GB18030_MBYTE1: wtf_push_unknown(os, p-1, 1); break; case WC_GB18030_MBYTE2: wtf_push_unknown(os, p-2, 2); break; case WC_GB18030_MBYTE3: wtf_push_unknown(os, p-3, 3); break; } return os; }
static Str wc_conv_to_ces(Str is, wc_ces ces) { Str os; wc_uchar *sp = (wc_uchar *)is->ptr; wc_uchar *ep = sp + is->length; wc_uchar *p; wc_status st; switch (ces) { case WC_CES_HZ_GB_2312: for (p = sp; p < ep && *p != '~' && *p < 0x80; p++) ; break; case WC_CES_TCVN_5712: case WC_CES_VISCII_11: case WC_CES_VPS: for (p = sp; p < ep && 0x20 <= *p && *p < 0x80; p++) ; break; default: for (p = sp; p < ep && *p < 0x80; p++) ; break; } if (p == ep) return is; os = Strnew_size(is->length); if (p > sp) p--; /* for precompose */ if (p > sp) Strcat_charp_n(os, is->ptr, (int)(p - sp)); wc_output_init(ces, &st); switch (ces) { case WC_CES_ISO_2022_JP: case WC_CES_ISO_2022_JP_2: case WC_CES_ISO_2022_JP_3: case WC_CES_ISO_2022_CN: case WC_CES_ISO_2022_KR: case WC_CES_HZ_GB_2312: case WC_CES_TCVN_5712: case WC_CES_VISCII_11: case WC_CES_VPS: #ifdef USE_UNICODE case WC_CES_UTF_8: case WC_CES_UTF_7: #endif while (p < ep) (*st.ces_info->push_to)(os, wtf_parse(&p), &st); break; default: while (p < ep) { if (*p < 0x80 && wtf_width(p + 1)) { Strcat_char(os, (char)*p); p++; } else (*st.ces_info->push_to)(os, wtf_parse(&p), &st); } break; } wc_push_end(os, &st); return os; }
Str wc_conv_from_hz( Str is, wc_ces ces ) { int eax; Str os; wc_uchar *sp = (wc_uchar*)is->ptr; wc_uchar *ep = &sp[ is->length ]; wc_uchar *p; int state = 0; p = sp; if ( p < ep ) { if ( p[0] >= 0 ) { if ( p[0] != '~' ) p++; else { if ( p == ep ) { is->ptr = (char*)is; return os; } else { os = Strnew_size( is->length ); if ( sp < p ) Strcat_charp_n( os, is->ptr, p - sp ); p++; if ( p < ep ) { switch ( state ) { default: break; case 0: if ( p[0] == '~' ) state = 1; else { if ( WC_ISO_MAP[ p[0] ] == '@' ) state = 5; else { if ( p[0] < 0 ) { wtf_push_unknown( os, p, 1 ); } if ( os->area_size <= os->length + 1 ) Strgrow( os ); os->ptr[ os->length ] = p[0]; os->length++; os->ptr[ os->length ] = 0; else { os->ptr[ os->length ] = p[0]; os->length++; os->ptr[ os->length ] = 0; } } } break; case 1: if ( p[0] == '{' ) state = 3; else { if ( p[0] == '~' ) { if ( os->area_size <= os->length + 1 ) Strgrow( os ); os->ptr[ os->length ] = p[0]; os->length++; os->ptr[ os->length ] = 0; state = 0; else { os->ptr[ os->length ] = p[0]; os->length++; os->ptr[ os->length ] = 0; state = 0; } } else { if ( p[0] == 10 ) { } else wtf_push_unknown( os, &p[ -1 ], 2 ); state = 0; } } break; case 2: if ( p[0] != '}' ) { if ( p[0] == 10 ) state = 0; else { if ( ( WC_ISO_MAP[ p[0] & 127 ] & 255 ) == 0 ) { wtf_push( os, 33089, p[0] | ( p[ -1 ] << 8 ) ); } wtf_push_unknown( os, &p[ -1 ], 2 ); state = 3; } } else state = 0; break; case 3: if ( p[0] == '~' ) state = 2; else { if ( ( WC_ISO_MAP[ p[0] & 127 ] & 255 ) == 0 ) state = 4; else wtf_push_unknown( os, p, 1 ); } break; case 4: if ( ( WC_ISO_MAP[ p[0] & 127 ] & 255 ) == 0 ) { wtf_push( os, 33089, p[0] | ( p[ -1 ] << 8 ) ); } wtf_push_unknown( os, &p[ -1 ], 2 ); state = 3; break; case 5: if ( WC_ISO_MAP[ p[0] ] == '@' ) { wtf_push( os, 33089, p[0] | ( p[ -1 ] << 8 ) ); } wtf_push_unknown( os, &p[ -1 ], 2 ); state = 0; break; } } else { if ( state <= 5 ) { if ( ( ( 1 << state ) & 54 ) != 0 ) wtf_push_unknown( os, &p[ -1 ], 1 ); os->ptr = (char*)os; return os; } } else { } } } } } }