improve .gph text escaping - stagit-gopher - A git gopher frontend. (mirror)
 (HTM) git clone git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/stagit-gopher/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3ef0c66de5c3087af621b94db15d28c9054586e1
 (DIR) parent 60eefdd22bc7d6b1a48b00906eb1d94e7322d9ea
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat,  1 Jul 2017 14:56:46 +0200
       
       improve .gph text escaping
       
       - also escape links [ in stagit-gopher-index.
       - always prefix dynamic text content with 't'.
       - don't escape patch lines starting with 't', it does not need to
         be escaped (it has a " ", "+" or "-" already).
       - don't allow newlines in certain fields (gphtext()), this would
         break escaping on lines.
       - add a separate gphtextnl() for a multi-line commit message.
       
       Diffstat:
         M stagit-gopher-index.c               |       2 +-
         M stagit-gopher.c                     |      33 ++++++++++++++++++++++++++-----
       
       2 files changed, 29 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/stagit-gopher-index.c b/stagit-gopher-index.c
       @@ -114,7 +114,7 @@ writeheader(FILE *fp)
                char buf[256];
        
                trim(buf, sizeof(buf), description);
       -        if (buf[0] == 't')
       +        if (buf[0] == 't' || buf[0] == '[')
                        fputc('t', fp);
                fprintf(fp, "%s\n\n", buf);
        
 (DIR) diff --git a/stagit-gopher.c b/stagit-gopher.c
       @@ -291,9 +291,10 @@ trim(char *buf, size_t bufsiz, const char *src)
                                for (i = 0; i < 8; i++)
                                        buf[d++] = ' ';
                                break;
       -                case '|':
       +                case '\r': /* ignore CR */
       +                case '|': /* ignore separators here */
       +                        break;
                        case '\n':
       -                case '\r':
                                buf[d++] = ' ';
                                break;
                        default:
       @@ -305,9 +306,9 @@ end:
                buf[d] = '\0';
        }
        
       -/* Escape characters in text in geomyidae .gph format */
       +/* Escape characters in text in geomyidae .gph format, with newlines */
        void
       -gphtext(FILE *fp, const char *s, size_t len)
       +gphtextnl(FILE *fp, const char *s, size_t len)
        {
                size_t i, n = 0;
        
       @@ -330,6 +331,23 @@ gphtext(FILE *fp, const char *s, size_t len)
                }
        }
        
       +/* Escape characters in text in geomyidae .gph format,
       +   newlines are ignored */
       +void
       +gphtext(FILE *fp, const char *s, size_t len)
       +{
       +        size_t i;
       +
       +        for (i = 0; *s && i < len; i++) {
       +                switch (s[i]) {
       +                case '\r':
       +                case '\n': break;
       +                case '\t': fputs("        ", fp); break;
       +                default: fputc(s[i], fp);
       +                }
       +        }
       +}
       +
        /* Escape characters in links in geomyidae .gph format */
        void
        gphlink(FILE *fp, const char *s, size_t len)
       @@ -425,6 +443,7 @@ printtimeshort(FILE *fp, const git_time *intime)
        void
        writeheader(FILE *fp, const char *title)
        {
       +        fputc('t', fp);
                gphtext(fp, title, strlen(title));
                if (title[0] && strippedname[0])
                        fputs(" - ", fp);
       @@ -521,7 +540,7 @@ printcommit(FILE *fp, struct commitinfo *ci)
                }
                if (ci->msg) {
                        fputc('\n', fp);
       -                gphtext(fp, ci->msg, strlen(ci->msg));
       +                gphtextnl(fp, ci->msg, strlen(ci->msg));
                        fputc('\n', fp);
                }
        }
       @@ -608,7 +627,9 @@ printshowfile(FILE *fp, struct commitinfo *ci)
                                if (git_patch_get_hunk(&hunk, &nhunklines, patch, j))
                                        break;
        
       +                        fputc('t', fp);
                                gphtext(fp, hunk->header, hunk->header_len);
       +                        fputc('\n', fp);
        
                                for (k = 0; ; k++) {
                                        if (git_patch_get_line_in_hunk(&line, patch, j, k))
       @@ -620,6 +641,7 @@ printshowfile(FILE *fp, struct commitinfo *ci)
                                        else
                                                fputs(" ", fp);
                                        gphtext(fp, line->content, line->content_len);
       +                                fputc('\n', fp);
                                }
                        }
                }
       @@ -797,6 +819,7 @@ writeblob(git_object *obj, const char *fpath, const char *filename, git_off_t fi
        
                fp = efopen(fpath, "w");
                writeheader(fp, filename);
       +        fputc('t', fp);
                gphtext(fp, filename, strlen(filename));
                fprintf(fp, " (%juB)\n", (uintmax_t)filesize);
                fputs("---\n", fp);