da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Original version by Michael T. Veach
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Adapted for ksh by David Korn */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* EMACS_MODES: c tabstop=4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinOne line screen editor for any program
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* The following is provided by:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Matthijs N. Melchior
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Network Systems International
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * APT Nederland
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * HV BZ335 x2962
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * hvlpb!mmelchio
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * These are now on by default
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - A ^N as first history related command after the prompt will move
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * to the next command relative to the last known history position.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * It will not start at the position where the last command was entered
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * as is done by the ^P command. Every history related command will
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * set both the current and last position. Executing a command will
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * only set the current position.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - Successive kill and delete commands will accumulate their data
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * in the kill buffer, by appending or prepending as appropriate.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This mode will be reset by any command not adding something to the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * kill buffer.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ESH_BETTER
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - Some enhancements:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - argument for a macro is passed to its replacement
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - ^X^H command to find out about history position (debugging)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - ^X^D command to show any debugging info
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * I do not pretend these for changes are completely independent,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * but you can use them to seperate features.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int print(int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int _isword(int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define genncpy(a,b,n) strncpy((char*)(a),(char*)(b),n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/**********************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinA large lookahead helps when the user is inserting
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincharacters in the middle of the line.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef enum
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FIRST, /* First time thru for logical line, prompt on screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint ed_emacsread(void *context, int fd,char *buff,int scend, int reedit)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(reedit?reedit:ed_read(context, fd,buff,scend,0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* This mess in case the read system call fails */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz out = (genchar*)roundof(buff-(char*)0,sizeof(genchar));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (location.hist_command == -5) /* to be initialized */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (location.hist_command <= hismin) /* don't start below minimum */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i !=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0); /* EOF */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location = hist_locate(sh.hist_ptr,location.hist_command,location.hist_line,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* accept a backslashed character */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == usrerase)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == usrlnext)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\0':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* u370 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\t':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,c); /* save character for next line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i = *kptr++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\n':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\r':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(c--) /* copy stuff */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((count--)&&(i>0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_KAPPEND */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_KAPPEND */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i < eol)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i < cur)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i >= 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_KAPPEND */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline = location.hist_command; /* start at saved position */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = hline; /* save current position */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == (-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* save current line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c!=' ')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* restore line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c= *sp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int escape(register Emacs_t* ep,register genchar *out,int count)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'p': /* M-p == ^W^Y (copy stack == kill & yank) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (value-- > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(i-cur);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(i-cur);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\b':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(value-- && i>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((i>0)&&(!isword(i)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(cur-i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '_' :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '.' :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* file name expansion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '=': /* escape = - list all matching file names */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(i=='=')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(i=='\\' && cur>ep->mark && (out[cur-1]=='/' || out[cur-1]==' '))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* search back for character */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i > cur)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(cur>0 && eol==cur && (cur<(SEARCHSIZE-2) || ep->prevdirection == -2))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ep->lastdraw==APPEND && ep->prevdirection != -2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* look for user defined macro definitions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* ESH_BETTER */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This routine process all commands starting with ^X
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define itos(i) fmtbase((long)(i),0,0)/* want signed conversion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if 0 /* debugging, modify as required */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* debugging code */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* ESH_BETTER */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void search(Emacs_t* ep,genchar *out,int direction)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* save current line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genncpy(str_buff,string,sizeof(str_buff)/sizeof(*str_buff));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((i = ed_getchar(ep->ed,1))&&(i != '\r')&&(i != '\n'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i==usrerase || i==DELETE || i=='\b' || i==ERASECHAR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i == '\\')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ep->prevdirection == -2 && i!=2 || direction!=1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i != 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location = hist_find(sh.hist_ptr,(char*)lstring,hline,1,direction);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = location.hist_line = 0; /* display first line of multi line command */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genncpy(string,str_buff,sizeof(str_buff)/sizeof(*str_buff));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Adjust screen to agree with inputs: logical line and cursor */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* If 'first' assume screen is blank */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Prompt is always kept on the screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*********************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Do not update screen if pending characters
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin **********************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->scvalid = 0; /* Screen is out of date, APPEND will not work */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /***************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin If in append mode, cursor at end of line, screen up to date,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin the previous character was a 'normal' character,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin and the window has room for another character.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Then output the character and adjust the screen only.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *****************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((option == APPEND)&&(ep->scvalid)&&(*logcursor == '\0')&&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* copy the line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ncursor = nptr + ed_virt_to_phys(ep->ed,sptr,nptr,cur,0,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*********************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Does ncursor appear on the screen?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin If not, adjust the screen offset so it does.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin **********************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((ep->offset && i<=ep->offset)||(i >= (ep->offset+w_size)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* Center the cursor on the screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*********************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Is the range of screen[0] thru screen[w_size] up-to-date
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin with nscreen[offset] thru nscreen[offset+w_size] ?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin If not, update as need be.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ***********************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i-- > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ep->ed->e_multiline && option == REFRESH && ep->ed->e_nocrnl==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ed_setcursor(ep->ed, ep->screen, ep->cursor-ep->screen, ep->ed->e_peol, -1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /******************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Screen overflow checks
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ********************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* Update screen overflow indicator if need be */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * put the cursor to the <newp> position within screen buffer
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if <c> is non-zero then output this character
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * cursor is set to reflect the change
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void setcursor(register Emacs_t *ep,register int newp,int c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin newp = ed_setcursor(ep->ed, ep->screen, oldp, newp, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */