mirror of
https://github.com/rfivet/uemacs.git
synced 2024-12-21 16:46:24 -05:00
Rewrite cinsert to avoid buffer size constraint when doing indentation in C mode.
This commit is contained in:
parent
a42c60045d
commit
775b16c7b1
43
random.c
43
random.c
@ -540,8 +540,7 @@ static int cinsert(void)
|
|||||||
char *cptr; /* string pointer into text to copy */
|
char *cptr; /* string pointer into text to copy */
|
||||||
int tptr; /* index to scan into line */
|
int tptr; /* index to scan into line */
|
||||||
int bracef; /* was there a brace at the end of line? */
|
int bracef; /* was there a brace at the end of line? */
|
||||||
int i;
|
int i, nicol ;
|
||||||
char ichar[NSTRING]; /* buffer to hold indent of last line */
|
|
||||||
|
|
||||||
/* grab a pointer to text to copy indentation from */
|
/* grab a pointer to text to copy indentation from */
|
||||||
cptr = &curwp->w_dotp->l_text[0];
|
cptr = &curwp->w_dotp->l_text[0];
|
||||||
@ -551,25 +550,43 @@ static int cinsert(void)
|
|||||||
bracef = (tptr > 0) && (cptr[ tptr - 1] == '{') ;
|
bracef = (tptr > 0) && (cptr[ tptr - 1] == '{') ;
|
||||||
|
|
||||||
/* save the indent of the previous line */
|
/* save the indent of the previous line */
|
||||||
i = 0;
|
nicol = 0 ;
|
||||||
while ((i < tptr) && (cptr[i] == ' ' || cptr[i] == '\t')
|
for( i = 0 ; i < tptr ; i += 1) {
|
||||||
&& (i < NSTRING - 1)) {
|
char ch ;
|
||||||
ichar[i] = cptr[i];
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
ichar[i] = 0; /* terminate it */
|
|
||||||
|
|
||||||
|
ch = cptr[ i] ;
|
||||||
|
if( ch == ' ')
|
||||||
|
nicol += 1 ;
|
||||||
|
else if( ch == '\t')
|
||||||
|
nicol += tabwidth - nicol % tabwidth ;
|
||||||
|
else
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( i == tptr) { /* all line is blank */
|
||||||
|
curwp->w_doto = 0 ; /* gotobol */
|
||||||
|
lnewline() ;
|
||||||
|
curwp->w_doto = tptr ; /* gotoeol */
|
||||||
|
} else {
|
||||||
/* put in the newline */
|
/* put in the newline */
|
||||||
if (lnewline() == FALSE)
|
if (lnewline() == FALSE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* and the saved indentation */
|
/* and the saved indentation */
|
||||||
linstr(ichar);
|
i = nicol % tabwidth ; /* spaces */
|
||||||
|
nicol /= tabwidth ; /* tabs */
|
||||||
|
if( bracef) {
|
||||||
/* and one more tab for a brace */
|
/* and one more tab for a brace */
|
||||||
if (bracef)
|
nicol += 1 ;
|
||||||
insert_tab(FALSE, 1);
|
i = 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( nicol > 0)
|
||||||
|
insert_tab( FALSE, nicol) ;
|
||||||
|
|
||||||
|
if( i > 0)
|
||||||
|
linsert( i, ' ') ;
|
||||||
|
}
|
||||||
#if SCROLLCODE
|
#if SCROLLCODE
|
||||||
curwp->w_flag |= WFINS;
|
curwp->w_flag |= WFINS;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user