imd2point.c - pointtools - Simple point utilities to hold text presentations. Err bitreich.org 70 hgit clone git://bitreich.org/pointtools/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/pointtools/ URL:git://bitreich.org/pointtools/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/pointtools/ bitreich.org 70 1Log /scm/pointtools/log.gph bitreich.org 70 1Files /scm/pointtools/files.gph bitreich.org 70 1Refs /scm/pointtools/refs.gph bitreich.org 70 1Tags /scm/pointtools/tag bitreich.org 70 1README /scm/pointtools/file/README.md.gph bitreich.org 70 1LICENSE /scm/pointtools/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 imd2point.c (3365B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 /* Err bitreich.org 70 i 2 * See LICENSE for license details. Err bitreich.org 70 i 3 */ Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 #ifdef NEED_STRLCPY /* OpenBSD implementation */ Err bitreich.org 70 i 12 size_t Err bitreich.org 70 i 13 strlcpy(char *dst, const char *src, size_t dsize) { Err bitreich.org 70 i 14 const char *osrc = src; Err bitreich.org 70 i 15 size_t nleft = dsize; Err bitreich.org 70 i 16 Err bitreich.org 70 i 17 if (nleft != 0) { Err bitreich.org 70 i 18 while (--nleft != 0) { Err bitreich.org 70 i 19 if ((*dst++= *src++) == '\0') Err bitreich.org 70 i 20 break; Err bitreich.org 70 i 21 } Err bitreich.org 70 i 22 } Err bitreich.org 70 i 23 Err bitreich.org 70 i 24 if (nleft == 0) { Err bitreich.org 70 i 25 if (dsize != 0) Err bitreich.org 70 i 26 *dst = '\0'; Err bitreich.org 70 i 27 while (*src++) Err bitreich.org 70 i 28 ; Err bitreich.org 70 i 29 } Err bitreich.org 70 i 30 Err bitreich.org 70 i 31 return(src - osrc - 1); Err bitreich.org 70 i 32 } Err bitreich.org 70 i 33 #endif /* NEED_STRLCPY */ Err bitreich.org 70 i 34 Err bitreich.org 70 i 35 /* from git://bitreich.org/utf8expr */ Err bitreich.org 70 i 36 size_t Err bitreich.org 70 i 37 utf8strlen(const char *s) Err bitreich.org 70 i 38 { Err bitreich.org 70 i 39 size_t i; Err bitreich.org 70 i 40 Err bitreich.org 70 i 41 for (i = 0; *s; s++) { Err bitreich.org 70 i 42 if ((*s & 0xc0) != 0x80) Err bitreich.org 70 i 43 i++; Err bitreich.org 70 i 44 } Err bitreich.org 70 i 45 Err bitreich.org 70 i 46 return i; Err bitreich.org 70 i 47 } Err bitreich.org 70 i 48 Err bitreich.org 70 i 49 void Err bitreich.org 70 i 50 fprintunderline(FILE *fp, const char *str) Err bitreich.org 70 i 51 { Err bitreich.org 70 i 52 size_t i, len; Err bitreich.org 70 i 53 Err bitreich.org 70 i 54 fprintf(fp, "\n %s\n ", str); Err bitreich.org 70 i 55 len = utf8strlen(str); Err bitreich.org 70 i 56 for (i = 0; i <= len; ++i) Err bitreich.org 70 i 57 fputs("=", fp); Err bitreich.org 70 i 58 fputs("\n\n", fp); Err bitreich.org 70 i 59 } Err bitreich.org 70 i 60 Err bitreich.org 70 i 61 void Err bitreich.org 70 i 62 escapechars(char *s) Err bitreich.org 70 i 63 { Err bitreich.org 70 i 64 for (; *s; s++) { Err bitreich.org 70 i 65 if (*s == '\n') { Err bitreich.org 70 i 66 *s = '\0'; Err bitreich.org 70 i 67 return; Err bitreich.org 70 i 68 } Err bitreich.org 70 i 69 Err bitreich.org 70 i 70 /* Err bitreich.org 70 i 71 * Only allow ASCII printable a-zA-Z0-9 for simplicity. Err bitreich.org 70 i 72 */ Err bitreich.org 70 i 73 if ((*s >= 'a' && *s <= 'z') Err bitreich.org 70 i 74 || (*s >= 'A' && *s <= 'Z') Err bitreich.org 70 i 75 || (*s >= '0' && *s <= '9')) { Err bitreich.org 70 i 76 continue; Err bitreich.org 70 i 77 } Err bitreich.org 70 i 78 *s = '_'; Err bitreich.org 70 i 79 } Err bitreich.org 70 i 80 } Err bitreich.org 70 i 81 Err bitreich.org 70 i 82 void Err bitreich.org 70 i 83 fprintesc(FILE *fp, const char *s) Err bitreich.org 70 i 84 { Err bitreich.org 70 i 85 int intext = 0; Err bitreich.org 70 i 86 Err bitreich.org 70 i 87 fputs(" ", fp); Err bitreich.org 70 i 88 for (; *s; s++) { Err bitreich.org 70 i 89 switch (*s) { Err bitreich.org 70 i 90 case ' ': Err bitreich.org 70 i 91 fputc(' ', fp); Err bitreich.org 70 i 92 break; Err bitreich.org 70 i 93 case '\t': Err bitreich.org 70 i 94 fprintf(fp, " "); Err bitreich.org 70 i 95 break; Err bitreich.org 70 i 96 case '*': Err bitreich.org 70 i 97 if (intext) { Err bitreich.org 70 i 98 fputc(*s, fp); Err bitreich.org 70 i 99 } else { Err bitreich.org 70 i 100 fputc('o', fp); Err bitreich.org 70 i 101 intext = 1; Err bitreich.org 70 i 102 } Err bitreich.org 70 i 103 break; Err bitreich.org 70 i 104 default: Err bitreich.org 70 i 105 intext = 1; Err bitreich.org 70 i 106 fputc(*s, fp); Err bitreich.org 70 i 107 break; Err bitreich.org 70 i 108 } Err bitreich.org 70 i 109 } Err bitreich.org 70 i 110 fputs("\n", fp); Err bitreich.org 70 i 111 } Err bitreich.org 70 i 112 Err bitreich.org 70 i 113 void Err bitreich.org 70 i 114 mkfilename(char *fname, char *str, size_t bufsiz, int i) Err bitreich.org 70 i 115 { Err bitreich.org 70 i 116 char buf[PATH_MAX]; Err bitreich.org 70 i 117 Err bitreich.org 70 i 118 strlcpy(buf, str, sizeof(buf)); Err bitreich.org 70 i 119 escapechars(buf); Err bitreich.org 70 i 120 snprintf(fname, bufsiz, "%.4d-%s.txt", i, buf); Err bitreich.org 70 i 121 } Err bitreich.org 70 i 122 Err bitreich.org 70 i 123 void Err bitreich.org 70 i 124 copyfile(char *dst, char *src) Err bitreich.org 70 i 125 { Err bitreich.org 70 i 126 int c; Err bitreich.org 70 i 127 FILE *fsrc, *fdst; Err bitreich.org 70 i 128 Err bitreich.org 70 i 129 if (src[0] == '\0' || dst[0] == '\0' || Err bitreich.org 70 i 130 !(fsrc = fopen(src, "r")) || !(fdst = fopen(dst, "w"))) Err bitreich.org 70 i 131 err(1, "copyfile: %s -> %s", src, dst); Err bitreich.org 70 i 132 Err bitreich.org 70 i 133 while ((c = fgetc(fsrc)) != EOF) Err bitreich.org 70 i 134 fputc(c, fdst); Err bitreich.org 70 i 135 Err bitreich.org 70 i 136 fclose(fsrc); Err bitreich.org 70 i 137 fclose(fdst); Err bitreich.org 70 i 138 } Err bitreich.org 70 i 139 Err bitreich.org 70 i 140 int Err bitreich.org 70 i 141 main(void) Err bitreich.org 70 i 142 { Err bitreich.org 70 i 143 size_t i = 0; Err bitreich.org 70 i 144 char *line = NULL; Err bitreich.org 70 i 145 size_t linesize = 0; Err bitreich.org 70 i 146 ssize_t linelen; Err bitreich.org 70 i 147 char title[PATH_MAX] = "", fname[PATH_MAX] = "", fname_old[PATH_MAX] = ""; Err bitreich.org 70 i 148 FILE *fp = NULL; Err bitreich.org 70 i 149 Err bitreich.org 70 i 150 while ((linelen = getline(&line, &linesize, stdin)) > 0) { Err bitreich.org 70 i 151 if (line[linelen - 1] == '\n') Err bitreich.org 70 i 152 line[--linelen] = '\0'; Err bitreich.org 70 i 153 Err bitreich.org 70 i 154 if (line[0] == '%') Err bitreich.org 70 i 155 continue; Err bitreich.org 70 i 156 Err bitreich.org 70 i 157 if (line[0] == '\\') { Err bitreich.org 70 i 158 if (line[1] == '\0') Err bitreich.org 70 i 159 continue; Err bitreich.org 70 i 160 Err bitreich.org 70 i 161 /* ignore text before first header */ Err bitreich.org 70 i 162 if (fp) Err bitreich.org 70 i 163 fprintesc(fp, line+1); Err bitreich.org 70 i 164 } else if (line[0] == '#' && line[1] == '#') { Err bitreich.org 70 i 165 if (fp) { Err bitreich.org 70 i 166 fclose(fp); Err bitreich.org 70 i 167 fp = NULL; Err bitreich.org 70 i 168 } Err bitreich.org 70 i 169 strlcpy(title, line + 2, sizeof(title)); Err bitreich.org 70 i 170 mkfilename(fname, title, sizeof(fname), i++); Err bitreich.org 70 i 171 if (!(fp = fopen(fname, "w"))) Err bitreich.org 70 i 172 err(1, "fopen: %s", fname); Err bitreich.org 70 i 173 if (line[2] == '\0') Err bitreich.org 70 i 174 fputs("\n", fp); Err bitreich.org 70 i 175 else Err bitreich.org 70 i 176 fprintunderline(fp, title); Err bitreich.org 70 i 177 } else if (linelen > 5 && !strncmp(line, "#pause", linelen)) { Err bitreich.org 70 i 178 if (fp) { Err bitreich.org 70 i 179 fclose(fp); Err bitreich.org 70 i 180 fp = NULL; Err bitreich.org 70 i 181 } Err bitreich.org 70 i 182 strlcpy(fname_old, fname, sizeof(fname_old)); Err bitreich.org 70 i 183 mkfilename(fname, title, sizeof(fname), i++); Err bitreich.org 70 i 184 copyfile(fname, fname_old); Err bitreich.org 70 i 185 if (fname[0] != '\0' && !(fp = fopen(fname, "a"))) Err bitreich.org 70 i 186 err(1, "fopen: %s", fname); Err bitreich.org 70 i 187 } else { Err bitreich.org 70 i 188 /* ignore text before first header */ Err bitreich.org 70 i 189 if (fp) Err bitreich.org 70 i 190 fprintesc(fp, line); Err bitreich.org 70 i 191 } Err bitreich.org 70 i 192 } Err bitreich.org 70 i 193 Err bitreich.org 70 i 194 free(line); Err bitreich.org 70 i 195 Err bitreich.org 70 i 196 return 0; Err bitreich.org 70 i 197 } Err bitreich.org 70 .