tex: return a static buffer in ex_pathexpand() - 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 2413a868f0ce3e3d67a8732f7174de731c3f7a05
 (DIR) parent 505f0d068cdd0bb059a0d092a2f5fec6a1d7c763
 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
       Date:   Thu,  7 Oct 2021 12:47:14 +0330
       
       ex: return a static buffer in ex_pathexpand()
       
       Diffstat:
         M ex.c                                |      36 +++++++++++++------------------
       
       1 file changed, 15 insertions(+), 21 deletions(-)
       ---
 (DIR) diff --git a/ex.c b/ex.c
       t@@ -114,36 +114,40 @@ char *ex_filetype(void)
                return bufs[0].ft;
        }
        
       -/* replace % and # in paths and commands with current and alternate path names */
       +/* replace % and # with current and alternate path names; returns a static buffer */
        static char *ex_pathexpand(char *src, int spaceallowed)
        {
       -        struct sbuf *sb = sbuf_make();
       -        while (*src && *src != '\n' && (spaceallowed || (*src != ' ' && *src != '\t'))) {
       +        static char buf[1024];
       +        char *dst = buf;
       +        char *end = dst + sizeof(buf);
       +        while (dst + 1 < end && *src && *src != '\n' &&
       +                        (spaceallowed || (*src != ' ' && *src != '\t'))) {
                        if (*src == '%') {
                                if (!bufs[0].path || !bufs[0].path[0]) {
                                        ex_show("\"%\" is unset\n");
       -                                sbuf_free(sb);
                                        return NULL;
                                }
       -                        sbuf_str(sb, bufs[0].path);
       +                        dst += snprintf(dst, end - dst, "%s", bufs[0].path);
                                src++;
                                continue;
                        }
                        if (*src == '#') {
                                if (!bufs[1].path || !bufs[1].path[0]) {
                                        ex_show("\"#\" is unset\n");
       -                                sbuf_free(sb);
                                        return NULL;
                                }
       -                        sbuf_str(sb, bufs[1].path);
       +                        dst += snprintf(dst, end - dst, "%s", bufs[1].path);
                                src++;
                                continue;
                        }
                        if (*src == '\\' && src[1])
                                src++;
       -                sbuf_chr(sb, *src++);
       +                *dst++ = *src++;
                }
       -        return sbuf_done(sb);
       +        if (dst + 1 >= end)
       +                dst = end - 1;
       +        *dst = '\0';
       +        return buf;
        }
        
        /* the previous search keyword */
       t@@ -333,7 +337,6 @@ static int ec_edit(char *loc, char *cmd, char *arg)
                        return 1;
                if (path[0] && bufs_find(path) >= 0) {
                        bufs_switch(bufs_find(path));
       -                free(path);
                        return 0;
                }
                if (path[0] || !bufs[0].path)
       t@@ -354,7 +357,6 @@ static int ec_edit(char *loc, char *cmd, char *arg)
                xrow = MAX(0, MIN(xrow, lbuf_len(xb) - 1));
                xoff = 0;
                xtop = MAX(0, MIN(xtop, lbuf_len(xb) - 1));
       -        free(path);
                return 0;
        }
        
       t@@ -376,7 +378,6 @@ static int ec_read(char *loc, char *cmd, char *arg)
                        obuf = cmd_pipe(ecmd + 1, NULL, 0, 1);
                        if (obuf)
                                lbuf_edit(xb, obuf, pos, pos);
       -                free(ecmd);
                        free(obuf);
                } else {
                        int fd = open(path, O_RDONLY);
       t@@ -420,7 +421,6 @@ static int ec_write(char *loc, char *cmd, char *arg)
                        ibuf = lbuf_cp(xb, beg, end);
                        ex_print(NULL);
                        cmd_pipe(ecmd + 1, ibuf, 1, 0);
       -                free(ecmd);
                        free(ibuf);
                } else {
                        int fd;
       t@@ -671,16 +671,11 @@ static int ec_exec(char *loc, char *cmd, char *arg)
                if (!(ecmd = ex_pathexpand(arg, 1)))
                        return 1;
                if (!loc[0]) {
       -                int ret;
                        ex_print(NULL);
       -                ret = cmd_exec(ecmd);
       -                free(ecmd);
       -                return ret;
       +                return cmd_exec(ecmd);
                }
       -        if (ex_region(loc, &beg, &end)) {
       -                free(ecmd);
       +        if (ex_region(loc, &beg, &end))
                        return 1;
       -        }
                text = lbuf_cp(xb, beg, end);
                rep = cmd_pipe(ecmd, text, 1, 1);
                if (rep)
       t@@ -699,7 +694,6 @@ static int ec_make(char *loc, char *cmd, char *arg)
                if (!(target = ex_pathexpand(arg, 0)))
                        return 1;
                sprintf(make, "make %s", target);
       -        free(target);
                ex_print(NULL);
                if (cmd_exec(make))
                        return 1;