/* * Go to given column */ static void rl_goto (UDWORD pos) { if (pos == rl_colpos) return; if (rl_colpos > pos) { #ifdef ANSI_TERM int l = ((rl_prompt_len + rl_colpos) / rl_columns) - ((rl_prompt_len + pos) / rl_columns); if (l) s_catf (&rl_operate, ESC "[%dA", l); rl_colpos -= l * rl_columns; s_catc (&rl_operate, '\r'); rl_colpos -= (rl_prompt_len + rl_colpos) % rl_columns; if ((int)rl_colpos < 0) { if (rl_prompt_len) s_catf (&rl_operate, ESC "[%uC", rl_prompt_len); rl_colpos = 0; } #else while (pos < rl_colpos) { s_catc (&rl_operate, '\b'); rl_curpos --; } #endif } rl_syncpos (rl_colpos); while (rl_colpos + rl_ucscol.txt[rl_ucspos] <= pos && rl_ucspos < rl_ucscol.len) { s_catn (&rl_operate, rl_display.txt + rl_bytepos, rl_ucsbytes.txt[rl_ucspos]); rl_colpos += rl_ucscol.txt[rl_ucspos]; rl_bytepos += rl_ucsbytes.txt[rl_ucspos]; rl_ucspos++; } if (!((rl_prompt_len + rl_colpos) % rl_columns)) { if (rl_ucspos < rl_ucscol.len) s_catn (&rl_operate, rl_display.txt + rl_bytepos, rl_ucsbytes.txt[rl_ucspos]); else s_catc (&rl_operate, ' '); s_catc (&rl_operate, '\r'); } assert (rl_colpos == pos); }
/* * Re-check remaining line for multicolumn line break problems */ static void rl_recheck (BOOL clear) { int gpos, i; gpos = rl_colpos; while (rl_ucspos < rl_ucscol.len) { if (rl_ucs_at (&rl_ucs, rl_ucspos) == WEOF) { s_deln (&rl_ucs, sizeof (wint_tt) * rl_ucspos, sizeof (wint_tt)); s_delc (&rl_ucsbytes, rl_ucspos); s_delc (&rl_ucscol, rl_ucspos); s_delc (&rl_display, rl_bytepos); } else if (((rl_prompt_len + rl_colpos) % rl_columns) + (UBYTE)rl_ucscol.txt[rl_ucspos] > rl_columns) { for (i = (rl_columns - ((rl_prompt_len + rl_colpos) % rl_columns)); i > 0; i--) { wint_tt weof = WEOF; s_insn (&rl_ucs, sizeof (wint_tt) * rl_ucspos, (const char *)&weof, sizeof (wint_tt)); s_insc (&rl_ucscol, rl_ucspos, 1); s_insc (&rl_ucsbytes, rl_ucspos++, 1); s_insc (&rl_display, rl_bytepos++, ' '); s_catc (&rl_operate, ' '); rl_colpos++; } } else { s_catn (&rl_operate, rl_display.txt + rl_bytepos, rl_ucsbytes.txt[rl_ucspos]); rl_bytepos += rl_ucsbytes.txt[rl_ucspos]; rl_colpos += rl_ucscol.txt[rl_ucspos]; rl_ucspos++; } } #ifdef ANSI_TERM s_cat (&rl_operate, " \b"); if (clear) s_cat (&rl_operate, ANSI_CLEAR); #else s_cat (&rl_operate, " \b\b\b\b\b"); #endif rl_goto (gpos); }
int main(int argc, char **argv) { HC_DEF_S(s); s_catz(s, "hello world of possibilities!"); HC_SAFE_CSTR(s); fprintf(stdout, "[%i][%i][%s]\n", s->len, s->a, s->s); s->len = 0; /* truncate string */ s_catn(s, "hi ", 3); fwrite(s->s, s->len, 1, stdout); s_copyc(s, 'f'); s_catz(s, "olk"); s_catc(s, 's'); s_catc(s, '!'); s_catc(s, '\n'); fwrite(s->s, s->len, 1, stdout); s_upper(s); fwrite(s->s, s->len, 1, stdout); s_lower(s); fwrite(s->s, s->len, 1, stdout); s_copyz(s, "aa"); assert(sdiff("aa", "aa") == 0); assert(s_diffz(s, "aa") == 0); assert(s_diffn(s, "aa", slen("aa")) == 0); assert(sdiff("aa", "aaz") < 0); assert(s_diffz(s, "aaz") < 0); assert(s_diffn(s, "aaz", slen("aaz")) < 0); assert(sdiff("aa", "a0z") > 0); assert(s_diffz(s, "a0z") > 0); assert(s_diffn(s, "a0z", slen("a0z")) > 0); assert(sdiff("aa", "0") > 0); assert(s_diffz(s, "0") > 0); assert(s_diffn(s, "0", slen("0")) > 0); assert(sdiff("aa", "0zz") > 0); assert(s_diffz(s, "0zz") > 0); assert(s_diffn(s, "0zz", slen("0zz")) > 0); assert(sdiff("aa", "a") > 0); assert(s_diffz(s, "a") > 0); assert(s_diffn(s, "a", slen("a")) > 0); assert(sdiff("aa", "a0") > 0); assert(s_diffz(s, "a0") > 0); assert(s_diffn(s, "a0", slen("a0")) > 0); s_free(s); /* */ assert(s_cat_u4_hex(s, 0) == 1); assert(s_diffz(s, "0") == 0); print_s("[", s, "]\n"); s->len = 0; assert(s_cat_i4_hex(s, 0) == 1); assert(s_diffz(s, "0") == 0); print_s("[", s, "]\n"); s->len = 0; assert(s_cat_u4_hex(s, 0xffffffff) == 8); assert(s_diffz(s, "ffffffff") == 0); print_s("[", s, "]\n"); s->len = 0; assert(s_cat_i4_hex(s, (int32_t)0xffffffff) == 2); assert(s_diffz(s, "-1") == 0); print_s("[", s, "]\n"); s_free(s); /* */ assert(s_cat_u4_dec(s, 0) == 1); assert(s_diffz(s, "0") == 0); print_s("[", s, "]\n"); s->len = 0; assert(s_cat_i4_dec(s, 0) == 1); assert(s_diffz(s, "0") == 0); print_s("[", s, "]\n"); s->len = 0; assert(s_cat_u4_dec(s, 0xffffffff) == 10); assert(s_diffz(s, "4294967295") == 0); print_s("[", s, "]\n"); s->len = 0; assert(s_cat_i4_dec(s, (int32_t)0xffffffff) == 2); assert(s_diffz(s, "-1") == 0); print_s("[", s, "]\n"); s_free(s); /* */ assert(s_cat_u4_base36(s, 0) == 1); assert(s_diffz(s, "0") == 0); print_s("[", s, "]\n"); s->len = 0; assert(s_cat_i4_base36(s, 0) == 1); assert(s_diffz(s, "0") == 0); print_s("[", s, "]\n"); s->len = 0; assert(s_cat_u4_base36(s, 0xffffffff) == 7); assert(s_diffz(s, "1z141z3") == 0); print_s("[", s, "]\n"); s->len = 0; assert(s_cat_i4_base36(s, (int32_t)0xffffffff) == 2); assert(s_diffz(s, "-1") == 0); print_s("[", s, "]\n"); s_free(s); /* */ { void *out; int putlen; HC_DEF_S(t); s_copyz(s, "hello world of possibilities!"); putlen = s_putlen(s); HC_ALLOC(out, putlen); assert(s_put(s, out) == putlen); assert(s_get(t, out) == putlen); assert(s_diff(s, t) == 0); s->len = 0; s_reprn(s, out, putlen); print_s("[", s, "]\n"); HC_FREE(out); s_free(t); } /* */ s_free(s); return 0; }
/* * Handle tab key - start or continue tabbing */ static void rl_key_tab (void) { str_s str = { NULL, 0, 0 }; strc_t ins; const char *display; int i, off; UWORD columns; if (rl_tab_state == -1) { rl_insert (9); return; } if (!rl_tab_state) { if (!rl_ucs.len) { rl_insert ('m'); rl_insert ('s'); rl_insert ('g'); rl_insert (' '); } for (i = 0; i < rl_ucspos; i++) { if (rl_ucs_at (&rl_ucs, i) == ' ') { rl_tab_index = 0; rl_tab_state = 1; rl_tab_pos = i + 1; rl_linecompress (&rl_temp, rl_tab_pos, rl_ucspos); if ((rl_tab_cont = rl_tab_getnext (&rl_temp))) { ins = ConvTo (COLQUOTE, ENC(enc_loc)); s_init (&rl_colon, "", 0); s_catn (&rl_colon, ins->txt, ins->len); ins = ConvTo (COLNONE, ENC(enc_loc)); s_init (&rl_coloff, "", 0); s_catn (&rl_coloff, ins->txt, ins->len); while (rl_ucspos > rl_tab_pos) rl_left (1), rl_tab_len++; rl_tab_common = rl_tab_len; break; } } } if (!rl_tab_state) { printf ("\a"); return; } } else { rl_linecompress (&rl_temp, rl_tab_pos, rl_ucspos); rl_tab_cont = rl_tab_getnext (&rl_temp); rl_left (rl_tab_common); } for ( ; rl_tab_len; rl_tab_len--) rl_delete (); if (!rl_tab_cont) { printf ("\a"); rl_tab_state = 0; rl_recheck (TRUE); return; } str.txt = rl_tab_alias ? rl_tab_alias->alias : rl_tab_cont->nick; str.len = strlen (str.txt); for (off = 0; off < str.len; ) { wint_tt ucs = ConvGetUTF8 (&str, &off); rl_analyze_ucs (ucs, &display, &columns); rl_insert_basic (ucs, s_sprintf ("%s%s%s", rl_colon.txt, display, rl_coloff.txt), strlen (display) + rl_colon.len + rl_coloff.len, columns & 0xff); rl_tab_len++; } rl_left (rl_tab_len - rl_tab_common); rl_recheck (TRUE); }