tled: remove autoindent characters for blank lines - neatvi - [fork] simple vi-type editor with UTF-8 support
(HTM) git clone git://src.adamsgaard.dk/neatvi
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
---
(DIR) commit f8c38eeb1bb1287f403745c15f9aa99f200ddf4f
(DIR) parent dcb1d3eacc7ea7fdc2ee28b1eb6037e3d819cd2c
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Wed, 21 Oct 2015 21:46:53 +0330
led: remove autoindent characters for blank lines
Diffstat:
M led.c | 24 ++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)
---
(DIR) diff --git a/led.c b/led.c
t@@ -308,13 +308,16 @@ char *led_prompt(char *pref, char *post, char **kmap)
char *led_input(char *pref, char *post, char *ai, int ai_max, char **kmap)
{
struct sbuf *sb = sbuf_make();
- char *first_ai = NULL;
- int key, i;
+ char *ai_1st = NULL; /* first line auto-indentation */
+ int key;
while (1) {
char *ln = led_line(pref, post, ai, ai_max, &key, kmap);
+ int ln_sp = 0; /* number of initial spaces in ln */
+ while (ln[ln_sp] && (ln[ln_sp] == ' ' || ln[ln_sp] == '\t'))
+ ln_sp++;
if (pref)
- first_ai = uc_dup(ai);
- if (!pref)
+ ai_1st = uc_dup(pref[0] || ln[ln_sp] ? ai : "");
+ if (!pref && ln[ln_sp])
sbuf_str(sb, ai);
sbuf_str(sb, ln);
if (key == '\n')
t@@ -325,10 +328,11 @@ char *led_input(char *pref, char *post, char *ai, int ai_max, char **kmap)
term_chr('\n');
if (!pref || !pref[0]) { /* updating autoindent */
int ai_len = ai_max ? strlen(ai) : 0;
- for (i = 0; isspace((unsigned char) ln[i]); i++)
- if (ai_len < ai_max)
- ai[ai_len++] = ln[i];
- ai[ai_len] = '\0';
+ int ai_new = ln_sp;
+ if (ai_len + ai_new > ai_max)
+ ai_new = ai_max - ai_len;
+ memcpy(ai + ai_len, ln, ai_new);
+ ai[ai_len + ai_new] = '\0';
}
pref = NULL;
free(ln);
t@@ -338,8 +342,8 @@ char *led_input(char *pref, char *post, char *ai, int ai_max, char **kmap)
while (ai_max && post[0] && (post[0] == ' ' || post[0] == '\t'))
post++;
}
- strcpy(ai, first_ai);
- free(first_ai);
+ strcpy(ai, ai_1st);
+ free(ai_1st);
if (TK_INT(key))
return sbuf_done(sb);
sbuf_free(sb);