/* * lineedit.c -- line_edit() function * * Copyright (C) 1997 by Sony Computer Entertainment * All rights Reserved */ #include #include #include #include #include /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= * USER customize section */ #define INKEY getkey #define DISPCH dispch /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ /*---------------------------------------------------- * IBM-PC keyboard memo * * up arrow NULL H * down arrow NULL P * left arrow NULL K * right arrow NULL M * insert NULL R * delete NULL S * home NULL G * end NULL O * page up NULL I * page down NULL Q * F1...F10 NULL 0x3B...0x44 * F11,F12 NULL 0x85, 0x86 */ /* * local define */ extern INKEY(); extern DISPCH(); #define MOVELEFT (cmdchars[0]) #define MOVERIGHT (cmdchars[1]) #define MOVEBOL (cmdchars[2]) #define MOVEOL (cmdchars[3]) #define LEFTDEL (cmdchars[4]) #define DEL (cmdchars[5]) #define RIGHTALLDEL (cmdchars[6]) #define ALLDEL (cmdchars[7]) extern int ctrlcflag; static void displine(char *cp) { while( *cp ) DISPCH(*cp++); } static void back(int c) { while(c > 0) { DISPCH(8); c--; } } /* ***************************************************************** * Entry ! ***************************************************************** */ int line_edit(char *editbuf, int maxchar, char *cmdchars, char *endchars, int flags ) { int cp,size,cnt; int inch; char *s,*d; cp = size = strlen(editbuf); displine(editbuf); do { inch = INKEY(); #ifdef MSDOS if( isFUNC(inch) ) { switch( inch ) { case KEY_UP: inch = endchars[1]; break; case KEY_DOWN: /* down */ inch = endchars[2]; break; case KEY_LEFT: /* left */ inch = MOVELEFT; break; case KEY_RIGHT: /* right */ inch = MOVERIGHT; break; case KEY_DELETE: /* delete */ inch = DEL; break; default: break; } } #endif if( ctrlcflag ) { inch = endchars[0]; /* set normal end code */ } if( inch == MOVEBOL ) { /* move to begin of line */ back(cp); cp = 0; } else if ( inch == MOVEOL ) { /* move to end of line */ displine(&editbuf[cp]); cp = size; } else if ( inch == MOVELEFT ) { /* move left */ if( cp > 0 ) { back(1); cp--; } } else if ( inch == MOVERIGHT ) { /* move right */ if( cp < size ) { DISPCH(editbuf[cp++]); } } else if ( inch == LEFTDEL ) { /* left delete */ if( size > 0 && cp > 0 ) { cp--; back(1); d = &editbuf[cp]; s = d+1; for( cnt = cp+1 ; cnt < size ; cnt ++ ) { DISPCH(*s); *d++ = *s++; } DISPCH(' '); *d++ = *s++; back(size-cp); size--; } } else if ( inch == DEL ) { /* delete */ if( cp < size ) { d = &editbuf[cp]; s = d+1; for( cnt = cp+1 ; cnt < size ; cnt ++ ) { DISPCH(*s); *d++ = *s++; } DISPCH(' '); *d++ = *s++; back(size-cp); size--; } } else if ( inch == RIGHTALLDEL || inch == ALLDEL ) { /* right or all delete */ if( inch == ALLDEL ) { back(cp); cp = 0; } for( cnt = cp; cnt < size ; cnt ++ ) DISPCH(' '); back(size-cp); editbuf[cp] = 0; size = cp; } else if ( strchr(endchars,inch) == NULL ) { /* insert char */ if( inch < ' ' || size >= maxchar) DISPCH(7); else if( inch < 0x7f ) { if( cp < size ) { d = &editbuf[size+1]; s = d-1; for( cnt = size ; cp <= cnt ; cnt --) { *d-- = *s--; } displine(&editbuf[cp]); size ++; back( size - cp ); } editbuf[cp] = (char)inch; if( cp == size ) { editbuf[cp+1] = 0; size ++; } DISPCH(inch); cp++; } } } while ( (strrchr(endchars,inch) == NULL) && !( (flags & RETILL ) && inch >= 0x7f) ); editbuf[size] = 0; #ifdef LAST_BACK2TOP back(cp); #endif return(inch); }