// getstr.c - este programa implementa a funcao getstr, que le uma
// string do teclado e suporta as teclas de edicao, INS,
// HOME, DEL, END, BACKSPACE e setas p/ Esquerda e Direita.
//
// Uso:
// char *str = GetStr(maxChar);
// Onde maxChar e o tamanho maximo da string, se for especificado
// um numero menor ou igual a zero, e usado 255 como default.
// Caso seja pressionado ESC durante a leitura, NULL é retornado.
//
// Obs.: A string devolvida precisa ser desalocada pelo programa.
///
// Bugs: Não trabalha corretamente com o caracter TAB.
// Não suporta multiplas linhas.
//
// Data Autor Descricao
// 22/06/99 - Wenderson Teixeira Data de criacao
//
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <malloc.h>
#include <dos.h>
#include <readkey.h>
typedef enum { emInsert, emOverwrite } TEditMode;
void Beep(void)
{
sound(800);
delay(50);
nosound();
}
char *RemoveChar(char *str, int pos)
{
memmove(&str[pos], &str[pos + 1], strlen(&str[pos]) + 1);
return str;
}
char *InsertChar(char *str, int pos, char ch)
{
memmove(&str[pos + 1], &str[pos], strlen(&str[pos]) + 1);
str[pos] = ch;
return str;
}
char *GetStr(int size)
{
TEditMode EditMode = emInsert;
int len = 0, pos = 0, c, key, x;
char *str = (char *)malloc(size <= 0 ? 255 : size);
do
{
key = ReadKeyWait();
switch(key)
{
case DELETE:
if(pos < len)
{
RemoveChar(str, pos);
len--;
x = wherex();
printf("%s ", &str[pos]);
gotoxy(x, wherey());
}
break;
case INSERT:
EditMode = EditMode == emInsert ? emOverwrite : emInsert;
break;
case BKSPC:
if(len == 0 || pos == 0)
Beep();
else
{
RemoveChar(str, --pos);
len--;
printf("%c", key);
x = wherex();
printf("%s ", &str[pos]);
gotoxy(x, wherey());
}
break;
case ENTER:
return str;
case ESC:
free(str);
return 0;
case UP:
case DOWN:
break;
case LEFT:
if(pos)
{
pos--;
gotoxy(wherex() - 1, wherey());
}
else
Beep();
break;
case RIGHT:
if(pos < len)
{
pos++;
gotoxy(wherex() + 1, wherey());
}
else
Beep();
break;
case HOME:
gotoxy(wherex() - pos, wherey());
pos = 0;
break;
case END:
gotoxy(wherex() + len - pos, wherey());
pos = len;
break;
default:
if(key < 256 && len < (size <= 0 ? 255 : size))
{
if(EditMode == emInsert)
{
InsertChar(str, pos++, key);
len++;
}
else
{
pos == len ? len++ : 0;
str[pos++] = key;
}
str[len] = '\0';
printf("%c", key);
x = wherex();
if(pos < len)
{
printf(&str[pos]);
gotoxy(x, wherey());
}
}
else
Beep();
}
} while(key != ENTER && key != ESC);
return str;
}
void main()
{
char *str;
puts("String <no maximo 10 caracteres>: ");
str = GetStr(10);
clrscr();
if(str)
{
printf("String digitada: %s", str);
free(str);
}
getch();
}