A1exSun
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору void display(int l, int r, unsigned char *str) { /* функція виводу на екран тексту cp1251 */ int i, j, sp, p; /* індекси в рядках, відстань до пробілу або кінця рядка, кількість виведених символів */ char *newstr, *out; /* текст у cp1251, рядок для виведення */ int len = strlen(str); /* довжина тексту */ int w = 80 - l - r; /* ширина екрану */ newstr = win2oem(str); /* cp1251 > cp866 */ if (wherex() > l+1) gotoxy(l+1,wherey()+1); else gotoxy(l+1,wherey()); out = calloc(w+1,sizeof(char)); /* виділяємо пам'ять */ j = 0; /* індекс у рядку для виведення */ p = 0; /* кількість виведених символів */ for (i = 0; i < len; i++) { /* цикл перебору символів */ if (newstr[i] != '\r' && newstr[i] != '\n') { /* якщо символ не \r' і не \n */ out[j] = newstr[i]; /* копіюємо символ */ j++; /* індекс у рядку для виведення + 1 */ } sp = 0; /* відстань до пробілу або кінця рядка = 0 */ while (newstr[i+sp+1] != ' ' && newstr[i+sp+1] != '\0' && newstr[i+sp+1] != '\n') sp++; if (sp >= w) { /* якщо відстань більше ширини екрану */ strncpy(out,newstr+p,w); /* копіюємо частину тексту */ out[w] = 0; /* дописуємо завершуючий 0 в рядок */ j = w; /* індекс у рядку для виведення = ширина екрану */ i += w - 1; /* індекс в тексті + ширина екрану - 1 */ } if (j == w || newstr[i+1] == '\0' || newstr[i+1] == '\n' || sp > w - j) { j = 0; /* для циклу пропуску пробілів */ while (out[j] == ' ') j++; /* пропускаємо пробіли на початку рядка */ cprintf("%s",out+j); /* виводимо рядок */ if (str[i+1] != '\0') gotoxy(l+1,wherey()+1); /* переводимо каретку на новий рядок */ memset(out,0,w+1); /* заповнюємо нулями */ p = i; /* оновлюємо кількість виведених символів */ j = 0; /* індекс у рядку для виведення = 0 */ } } free(newstr); /* звільняємо пам'ять */ free(out); /* звільняємо пам'ять */ } |