#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>


#define ESC     0x1B
#define LEFT    0x4B
#define RIGHT   0x4D
#define HOME    0x47
#define END     0x4F
#define INSERT  0x52
#define DELETE  0x53
#define BACKSPC 0x08
#define ENTER   0x0D
#define CTLEND  0x75
#define CTLHOME 0x77
#define CTLRT   0x74
#define CTLLFT  0x73


int edgets(char *s, int maxlen, int mk_upper)
{
char temp[82];
int insert = 1, done = 0, pos, len, i, j, c, zeroflag;
static char curstart[2] = {6,4};
union REGS regs;

         cprintf("%s",s);
         strcpy(temp,s);
         pos = strlen(s);
         len = strlen(s);

         while (!done)
         {
                       zeroflag = 0;
                       if ((c = getch()) == 0)
                       {
                                 zeroflag = 1;
                                 c = getch();
                       }

                       if(mk_upper)
                               c = toupper(c);

                       switch (c)
                       {
                       case ESC :
                                 if (len == 0)
                                               break;

                                 for (i = pos; i < len; i++)
                                         putch(' ');
                                 for (i = len-1; i >= 0; i--) {
                                         putch(BACKSPC);
                                         putch(' ');
                                         putch(BACKSPC);
                                 }
                                 pos = len = 0;
                                 break;

                       case LEFT :
                                 if (zeroflag) {
                                               if (pos == 0)
                                                         break;
                                               pos--;
                                               putch(BACKSPC);
                                               break;
                                 }

                       case RIGHT :
                                 if (zeroflag) {
                                               if (pos == len)
                                                         break;
                                               if (pos != maxlen) {
                                                         putch(temp[pos]);
                                                         pos++;
                                               }
                                               break;
                                 }

                       case HOME :
                                 if (zeroflag) {
                                               while (pos-- > 0)
                                                         putch(BACKSPC);
                                               pos = 0;
                                               break;
                                 }

                       case END :
                                 if (zeroflag) {
                                               while (pos < len)
                                                         putch(temp[pos++]);
                                               break;
                                 }

                       case INSERT :
                                 if (zeroflag) {
                                               insert = (!(insert));

                                               regs.h.ah = 0x01;
                                               regs.h.ch = curstart[insert];
                                               regs.h.cl = 7;
                                               int86(0x10, &regs, &regs);
                                               break;
                                 }

                       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;
}