Программа "текстовый редактор"

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

// Вверх на строку

char * up(char * a,char * b) {

if (a==b) return b;

b--;

while ((a!=b)&&(*b!=13)) b--;

if (a==b) return b;

if (*b==13) b--;

if (a==b) return b;

while ((a!=b)&&(*b!=13)) b--;

if (*b==13) b++;

if (*b==10) b++;

return b;

}

// Вниз на строку

char * down(char * a,char * b) {

while (((a+32767)>=b)&&(*b!=13)) b++;

if (*b==13) b++;

if (*b==10) b++;

return b;

}

// Обработка меню

int menu(int x,int y,char * capt) {

int n,m; // Счетчики

int num; // Количество пунктов

int k; // Выбранный пункт

char * pt; // Временный указатель на символ

char c; // Считанный с клавиатуры символ

// Вычисляем количество пунктов

num=strlen(capt)/20;

// Курсор на нулевой элемент

k=0;

// Бесконечный цикл обработки

for (;;) {

// Вывод меню

pt=capt;

for (n=0;n<num;n++) {

gotoxy(x,y+n);

// Закраска пункта, на который указывает курсор

if (n==k) {

// Закраска

textbackground(12);

textcolor(14);

} else {

// Нормальный

textbackground(3);

textcolor(1);

}

cprintf("%d) ",n+1);

for (m=0;m<20;m++) cprintf("%c",*(pt++));

}

textbackground(3);

textcolor(1);

// Опрос клавиатуры

c=getch();

if (!c) c=getch();

// Проверка, не нажата ли клавиша с цифрой

if (((c-1)>=0)&&((c-1)<num)) {

// Установка указателя в зависимости от нажатой цифры

k=c-1;

// Запись в буфер клавиатуры символа ENTER

ungetch(13);

} else {

// Анализ

switch(c) {

// Вверх

case (72):

if (k>0) k--; else k=num-1;

break;

// Вниз

case (80):

if (k<(num-1)) k++; else k=0;

break;

// Выход по ESC - возвращается -1

case (27):

return -1;

// Выход по ENTER - возвращается номер пункта

case (13): return k;

}

}

}

}

// Добавление символа в текст

void add(char * st,char * a,int x,int y,char c) {

int n;

int d;

n=y;

char * p;

// Перемещение указателя к началу строки

while (n>0) {

while ((a<(st+32767))&&(*a!=13)) a++;

if (*a==13) a++;

if (*a==10) a++;

n--;

}

// Подсчет символов в строке

n=0;

while ((*(a+n)!=13)&&((a+n)<(st+32767))) n++;

if (n<x) {

// Если производится вставка в строку

a=a+n;

d=x-n;

p=st+32767;

while ((p-d)!=a) {

*p=*(p-d-1);

p--;

}

p=a;

while (d!=0) {

*p= ;

d--;

p++;

}

*p=c;

} else {

// Если производится добавление к строке не только символа,

// но и пробелов до него

a=a+x;

p=st+32767;

while (p!=a) {

*p=*(p-1);

p--;

}

*a=c;

}

}

// Поиск конца строки - фактически возвращает длину строки

int end(char * st,char * a,int,int y) {

int n;

n=y;

char * p;

while (n>0) {

while ((a<(st+32767))&&(*a!=13)) a++;

if (*a==13) a++;

if (*a==10) a++;

n--;

}

n=0;

while ((*(a+n)!=13)&&((a+n)<(st+32767))) n++;

return n;

}

// Удаление символа

void del(char *st,char * a,int x,int y) {

int n;

int d;

n=y;

char * p;

// Поиск необходимого места в тексте

while (n>0) {

while ((a<(st+32767))&&(*a!=13)) a++;

if (*a==13) a++;

if (*a==10) a++;

n--;

}

n=0;

while ((*(a+n)!=13)&&((a+n)<(st+32767))) n++;

if (n<x) x=n;

a+=x;

p=a;

n=*p;

// Удаление символа

while (a!=(st+32767)) {

*a=*(a+1);

a++;

}

// Если был удален "Перевод строки" и остался

// "Возврат каретки" либо наоборот, то удаляется еще один символ

if ((*p==13)&&(n==10)||(*p==10)&&(n==13)) {

while (p!=(st+32767)) {

*p=*(p+1);

p++;

}

}

}

// Поиск фрагмента в тексте, начиная с текущего положения курсора

void find(char * st,char * * scrs,int * x,int * y,char * b) {

char * a=*scrs;

int n;

int k;

int d;

n=*y;

char * p;

// Поиск текущего места

while (n>0) {

while ((a<(st+32767))&&(*a!=13)) a++;

if (*a==13) a++;

if (*a==10) a++;

n--;

}

n=0;

while ((*(a+n)!=13)&&((a+n)<(st+32767))) n++;

if (n<*x) *x=n;

a+=*x;

// Поиск фрагмента

do {

a++;

k=1;

for (n=0;n<strlen(b);n++)

if (a[n]!=b[n]) k=0;

} while ((k!=1)&&(a<(st+32767)));

if (k==1) {

// Если фрагмент найден - перемещение курсора

*x=0;

*y=0;

while ((*a!=13)&&(a!=st)) {

a--;

(*x)++;

}

if (*a==13) {

a++;

(*x)--;

}

if (*a==10) {

a++;

(*x)--;

}

*scrs=a;

}

}

// Ввод числа

// x,y - координаты

long DInput(int x,int y) {

char s[100]; // Временная строка

char *stpe;

long rz;

s[0]=0;

int n; // Счетчик

char c; // Символ

// Вывод пустой строки

textbackground(2);

textcolor(15);

gotoxy(x,y);

for (n=0;n<15;n++) cprintf(" ");

n=strlen(s); // Положение курсора

do {

// Вывод строки

gotoxy(x,y);

cprintf("%s ",s);

gotoxy(x+n,y);

c=getch(); // Считывание символа с клавиатуры

if ((c!=13)&&(c!=27)&&(c!=8)) {

// Нажата символьная клавиша

if (n<14) {

// Добавление цифры

if ((c>=0)&&(c<=9)) {

s[n+1]=0;

s[n]=c;

n++;

}

}

} else {

if (c==8) {

// Нажата клавиша BackSpace

if (n>0) {

n--;

s[n]=0;

}

}

}

// Выход, если ESC или ENTER

} while ((c!=27)&&(c!=13));

if(c==27) return 0;

// Стирание строки

textbackground(0);

textcolor(7);

gotoxy(x,y);

for (n=0;n<15;n++) cprintf(" ");

sscanf(s,"%ld",&rz);

return rz;

}

// Центровка текущей строки

void centr(char *st,char * a,int y,int left,int right) {

int n;

int d;

n=y;

// Поиск текущего местоположения

while (n>0) {

while ((a<(st+32767))&&(*a!=13)) a++;

if (*a==13) a++;

if (*a==10) a++;

n--;

}

// Удаление пробелов в начале строки

while ((*a==32)&&(!((*a==13)||(a==(st+32767))))) del(st,a,0,0);

// Подсчет длины строки

n=0;

while ((*(a+n)!=13)&&((a+n)<(st+32767))) n++;

// Определение количества добавляемых пробелов

if ((n>(right-left))||(n==0)) return;

d=left+((right-left)-n)/2;

// Добавление пробелов

for (n=0;n<d;n++) add(st,a,0,0, );

}

// Основная программа

void main() {

// Границы текста

int left=0