case DELETE :
if (zeroflag) {
if (pos == len)
break;
for (i = pos; i < len; i++)
temp[i] = temp[i + 1];
len--;
for (i = pos; i < len; i++)
putch(temp[i]);
putch(' ');
for (i = len + 1; i > pos; i--)
putch(BACKSPC);
break;
}
case BACKSPC :
if (c == BACKSPC) {
if (pos == 0)
break;
if (pos != len) {
for (i = pos - 1; i < len; i++)
temp[i] = temp[i + 1];
pos--;
len--;
putch(BACKSPC);
for (i = pos; i < len; i++)
putch(temp[i]);
putch(' ');
for (i = len; i >= pos; i--)
putch(BACKSPC);
}
else {
putch(BACKSPC);
putch(' ');
putch(BACKSPC);
pos = --len;
}
break;
}
case ENTER :
if (c == ENTER) {
done = 1;
break;
}
case CTLEND :
if (zeroflag) {
for (i = pos; i < len; ++i)
putch(' ');
for (i = pos; i < len; ++i)
putch(BACKSPC);
len = pos;
break;
}
case CTLHOME :
if (zeroflag) {
if (pos == 0)
break;
if (pos != len) {
while (0 != pos) {
for (i = pos - 1; i < len; i++)
temp[i] = temp[i + 1];
pos--;
len--;
putch(BACKSPC);
for (i = pos; i < len; i++)
putch(temp[i]);
putch(' ');
for (i = len; i >= pos; i--)
putch(BACKSPC);
}
}
else {
while (0 != pos) {
putch(BACKSPC);
putch(' ');
putch(BACKSPC);
pos = --len;
}
}
break;
}
case CTLRT :
if (zeroflag) {
do {
if (pos == len)
break;
if (pos != maxlen) {
putch(temp[pos]);
pos++;
}
} while (isspace(temp[pos]));
do {
if (pos == len)
break;
if (pos != maxlen) {
putch(temp[pos]);
pos++;
}
} while (!isspace(temp[pos]));
break;
}
case CTLLFT :
if (zeroflag) {
do {
if (pos == 0)
break;
pos--;
putch(BACKSPC);
} while (isspace(temp[pos]));
while(1) {
if (pos == 0)
break;
pos--;
if(!isspace(temp[pos]))
putch(BACKSPC);
else {
pos++;
break;
}
}
break;
}
default :
if (zeroflag)
break;
if (c == 0 || pos == maxlen)
break;
if ((!(insert)) || pos == len) {
temp[pos++] = (char)c;
if (pos > len) len++;
putch(c);
}
else {
if(len == maxlen)
break;
for (i = len++; i >= pos; i--)
temp[i + 1] = temp[i];
temp[pos++] = (char)c;
putch(c);
for (i = pos; i < len; i++)
putch(temp[i]);
for (i = len; i > pos; i--)
putch(BACKSPC);
}
}
}
temp[len] = '\0';
strcpy(s, temp);
return len;
}