Rewrite md2point in c and add minimal manpage - pointtools - Simple point utilities to hold text presentations.
 (HTM) git clone git://bitreich.org/pointtools/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/pointtools/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d8eed1a76732e11cf44c4724f71dfc0072d40adc
 (DIR) parent fd83f17fab6afefa04c18b6e8f2938b916b9d008
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Wed, 29 Apr 2020 15:59:19 +0200
       
       Rewrite md2point in c and add minimal manpage
       
       Signed-off-by: Christoph Lohmann <20h@r-36.net>
       
       Diffstat:
         M Makefile                            |      14 ++++++++++++++
         R bin/md2point -> bin/md2point.sh     |       0 
         A md2point.1                          |      42 +++++++++++++++++++++++++++++++
         A md2point.c                          |     164 +++++++++++++++++++++++++++++++
       
       4 files changed, 220 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       @@ -1,11 +1,25 @@
        PREFIX=        /usr/local
        
       +bin/md2point: md2point.o
       +        ${CC} -o $@ md2point.o ${LDFLAGS}
       +
       +.c.o:
       +        ${CC} -c ${CFLAGS} $<
       +
        install:
                install -m755 bin/dir2point $(PREFIX)/bin/dir2point
                install -m755 bin/md2point  $(PREFIX)/bin/md2point
                install -m755 bin/point2pdf $(PREFIX)/bin/point2pdf
       +        install -m644 md2point.1    $(PREFIX)/share/man/man1/md2point.1
        
        uninstall:
                rm -f $(PREFIX)/bin/dir2point
                rm -f $(PREFIX)/bin/md2point
                rm -f $(PREFIX)/bin/point2pdf
       +        rm -f $(PREFIX)/share/man/man1/md2point.1
       +
       +clean:
       +        rm -f bin/md2point
       +        rm -f md2point.o
       +
       +.PHONY: install uninstall clean
 (DIR) diff --git a/bin/md2point b/bin/md2point.sh
 (DIR) diff --git a/md2point.1 b/md2point.1
       @@ -0,0 +1,42 @@
       +.Dd $Mdocdate$
       +.Dt MD2POINT 1
       +.Os
       +.Sh NAME
       +.Nm md2point
       +.Nd converts markdown into catpoint presentation files
       +.Sh SYNOPSIS
       +.Nm
       +.Sh DESCRIPTION
       +The
       +.Nm
       +utility reads markdown from stdin and writes formatted text files
       +to the current directory.  The output text files are intended for
       +use with catpoint.  The output files are named in a consecutive
       +manner with the title in the file name.
       +.Sh MARKDOWN FORMAT
       +.Pp
       +Lines beginning with
       +.Em ## 
       +are treated as slide titles, and serve as delimiters between output
       +slides.
       +.Pp
       +Lines beginning with
       +.Em %
       +are treated as comments, and are not reproduced in the output.
       +.Pp
       +Lines beginning with
       +.Em #pause
       +denote breaks within slides.
       +.Pp
       +Any other text and formatting is reproduced exactly in the output.
       +.Sh EXIT STATUS
       +.Nm
       +exits with 0 on success, and >0 if a a runtime error occurs.
       +.Sh SEE ALSO
       +.Xr catpoint
       +.Xr dir2point
       +.Sh AUTHORS
       +.An Anders Damsgaard Aq Mt anders@adamsgaard.dk ,
       +and
       +.An Christoph Lohmann Aq Mt 20h@r-36.net
       +(original implementation).
 (DIR) diff --git a/md2point.c b/md2point.c
       @@ -0,0 +1,164 @@
       +#include <stdio.h>
       +#include <stdlib.h>
       +#include <err.h>
       +#include <string.h>
       +
       +#define PATH_MAX 128
       +
       +char buf[PATH_MAX];
       +
       +/* from git://bitreich.org/utf8expr */
       +size_t
       +utf8strlen(char *s)
       +{
       +        size_t i;
       +
       +        i = 0;
       +        for (; s[0]; s++) {
       +                if ((s[0] & 0xc0) != 0x80)
       +                        i++;
       +        }
       +
       +        return i;
       +}
       +
       +void
       +fprintunderline(FILE *fp, char *str, size_t linelen)
       +{
       +        size_t i;
       +        fprintf(fp, "\n  %s\n  ", str);
       +        for (i=0; i<=utf8strlen(str); ++i)
       +                fputs("=", fp);
       +        fputs("\n\n", fp);
       +}
       +
       +void
       +escapechars(char *s, size_t linelen)
       +{
       +        size_t i;
       +        for (i=0; i<linelen && *s != '\0'; (void)*s++, i++)
       +                switch (*s) {
       +                        case '#':
       +                        case ' ':
       +                        case '        ':
       +                        case ':':
       +                        case '.':
       +                        case '(':
       +                        case ')':
       +                        case '/':
       +                                *s = '_';
       +                                break;
       +                        case '\n':
       +                                *s = '\0';
       +                                return;
       +                        default:
       +                                break;
       +                }
       +}
       +
       +void
       +fprintesc(FILE *fp, char *s, ssize_t len)
       +{
       +        ssize_t i;
       +        int intext;
       +
       +        intext = 0;
       +        fputs("  ", fp);
       +        for (i=0; i<len && s[i] != '\0'; i++)
       +                switch (s[i]) {
       +                        case ' ':
       +                                fputc(' ', fp);
       +                                break;
       +                        case '\t':
       +                                fprintf(fp, "        ");
       +                                break;
       +                        case '*':
       +                                if (!intext) {
       +                                        fputc('o', fp);
       +                                        break;
       +                                }
       +                        default:
       +                                intext = 1;
       +                                fputc(s[i], fp);
       +                                break;
       +                }
       +        fputs("\n", fp);
       +}
       +
       +void
       +mkfilename(char *fname, char *str, size_t len, int i)
       +{
       +        strlcpy(buf, str, len);
       +        escapechars(buf, len);
       +        snprintf(fname, len, "%.4d-%s.txt", i, buf);
       +}
       +
       +void
       +copyfile(char *dst, char *src)
       +{
       +        char c;
       +        FILE *fsrc, *fdst;
       +
       +        if (strlen(src) < 1 || strlen(dst) < 1 ||
       +                !(fsrc = fopen(src, "r")) || !(fdst = fopen(dst, "w")))
       +                err(1, "copyfile: %s -> %s", src, dst);
       +
       +        while ((c = fgetc(fsrc)) != EOF)
       +                fputc(c, fdst);
       +
       +        fclose(fsrc);
       +        fclose(fdst);
       +}
       +
       +int
       +main(int argc, char* argv[])
       +{
       +        int i;
       +        static char *line;
       +        static size_t linesize;
       +        ssize_t linelen;
       +        char title[PATH_MAX], fname[PATH_MAX], fname_old[PATH_MAX];
       +        FILE *fp;
       +
       +        fp = NULL;
       +        title[0] = fname[0] = fname_old[0] = '\0';
       +        i = 0;
       +        while ((linelen = getline(&line, &linesize, stdin)) > 0) {
       +
       +                if (line[linelen-1] == '\n')
       +                        line[--linelen] = '\0';
       +
       +                if (linelen > 1 && line[0] == '#' && line[1] == '#') {
       +                        if (fp)
       +                                fclose(fp);
       +                        strlcpy(title, line+2, PATH_MAX);
       +                        mkfilename(fname, title, PATH_MAX, i++);
       +                        if (!(fp = fopen(fname, "w")))
       +                                err(1, "fopen: %s", fname);
       +                        if (linelen == 2)
       +                                fputs("\n", fp);
       +                        else
       +                                fprintunderline(fp, title, linelen);
       +
       +                } else if (linelen > 0 && line[0] == '%') {
       +                        continue;
       +
       +                } else if (linelen > 5 && !strncmp(line, "#pause", linelen)) {
       +                        if (fp)
       +                                fclose(fp);
       +                        strlcpy(fname_old, fname, PATH_MAX);
       +                        mkfilename(fname, title, PATH_MAX, i++);
       +                         copyfile(fname, fname_old);
       +                        if (strlen(fname) > 0 && !(fp = fopen(fname, "a")))
       +                                err(1, "fopen: %s", fname);
       +
       +                } else {
       +                        /* ignore text before first header */
       +                        if (fp)
       +                                fprintesc(fp, line, linelen);
       +                }
       +        }
       +
       +        free(line);
       +        return 0;
       +}