static void WCEL_InsertString(WCEL_Context* ctx, const WCHAR* str) { size_t len = lstrlenW(str), updtlen; if (!len) return; if (ctx->insert) { if (!WCEL_Grow(ctx, len)) return; if (ctx->len > ctx->ofs) memmove(&ctx->line[ctx->ofs + len], &ctx->line[ctx->ofs], (ctx->len - ctx->ofs) * sizeof(WCHAR)); ctx->len += len; updtlen = ctx->len - ctx->ofs; } else { if (ctx->ofs + len > ctx->len) { if (!WCEL_Grow(ctx, (ctx->ofs + len) - ctx->len)) return; ctx->len = ctx->ofs + len; } updtlen = len; } memcpy(&ctx->line[ctx->ofs], str, len * sizeof(WCHAR)); ctx->line[ctx->len] = 0; WCEL_Update(ctx, ctx->ofs, updtlen); ctx->ofs += len; }
static void WCEL_Redraw(WCEL_Context* ctx) { COORD c = WCEL_GetCoord(ctx, ctx->len); CHAR_INFO ci; WCEL_Update(ctx, 0, ctx->len); ci.Char.UnicodeChar = ' '; ci.Attributes = ctx->csbi.wAttributes; CONSOLE_FillLineUniform(ctx->hConOut, c.X, c.Y, ctx->csbi.dwSize.X - c.X, &ci); }
static void WCEL_UpperCaseWord(WCEL_Context* ctx) { unsigned int new_ofs = WCEL_GetRightWordTransition(ctx, ctx->ofs); if (new_ofs != ctx->ofs) { unsigned int i; for (i = ctx->ofs; i <= new_ofs; i++) ctx->line[i] = toupperW(ctx->line[i]); WCEL_Update(ctx, ctx->ofs, new_ofs - ctx->ofs + 1); ctx->ofs = new_ofs; } }
static void WCEL_TransposeChar(WCEL_Context* ctx) { WCHAR c; if (!ctx->ofs || ctx->ofs == ctx->len) return; c = ctx->line[ctx->ofs]; ctx->line[ctx->ofs] = ctx->line[ctx->ofs - 1]; ctx->line[ctx->ofs - 1] = c; WCEL_Update(ctx, ctx->ofs - 1, 2); ctx->ofs++; }
static void WCEL_TransposeWords(WCEL_Context* ctx) { unsigned int left_ofs = WCEL_GetLeftWordTransition(ctx, ctx->ofs), right_ofs = WCEL_GetRightWordTransition(ctx, ctx->ofs); if (left_ofs < ctx->ofs && right_ofs > ctx->ofs) { unsigned len_r = right_ofs - ctx->ofs; unsigned len_l = ctx->ofs - left_ofs; char* tmp = HeapAlloc(GetProcessHeap(), 0, len_r * sizeof(WCHAR)); if (!tmp) return; memcpy(tmp, &ctx->line[ctx->ofs], len_r * sizeof(WCHAR)); memmove(&ctx->line[left_ofs + len_r], &ctx->line[left_ofs], len_l * sizeof(WCHAR)); memcpy(&ctx->line[left_ofs], tmp, len_r * sizeof(WCHAR)); HeapFree(GetProcessHeap(), 0, tmp); WCEL_Update(ctx, left_ofs, len_l + len_r); ctx->ofs = right_ofs; } }
static void WCEL_DeleteString(WCEL_Context* ctx, int beg, int end) { unsigned str_len = end - beg; if (end < ctx->len) memmove(&ctx->line[beg], &ctx->line[end], (ctx->len - end) * sizeof(WCHAR)); /* we need to clean from ctx->len - str_len to ctx->len */ if (ctx->shall_echo) { COORD cbeg = WCEL_GetCoord(ctx, ctx->len - str_len); COORD cend = WCEL_GetCoord(ctx, ctx->len); CHAR_INFO ci; ci.Char.UnicodeChar = ' '; ci.Attributes = ctx->csbi.wAttributes; if (cbeg.Y == cend.Y) { /* partial erase of sole line */ CONSOLE_FillLineUniform(ctx->hConOut, cbeg.X, cbeg.Y, cend.X - cbeg.X, &ci); } else { int i; /* erase til eol on first line */ CONSOLE_FillLineUniform(ctx->hConOut, cbeg.X, cbeg.Y, ctx->csbi.dwSize.X - cbeg.X, &ci); /* completely erase all the others (full lines) */ for (i = cbeg.Y + 1; i < cend.Y; i++) CONSOLE_FillLineUniform(ctx->hConOut, 0, i, ctx->csbi.dwSize.X, &ci); /* erase from beginning of line until last pos on last line */ CONSOLE_FillLineUniform(ctx->hConOut, 0, cend.Y, cend.X, &ci); } } ctx->len -= str_len; WCEL_Update(ctx, 0, ctx->len); ctx->line[ctx->len] = 0; }