iuse a binary search for checking the gopher type file extensions - gopher-validator - Simple gopher menu validator. Err bitreich.org 70 hgit clone git://bitreich.org/gopher-validator git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/gopher-validator URL:git://bitreich.org/gopher-validator git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/gopher-validator bitreich.org 70 1Log /scm/gopher-validator/log.gph bitreich.org 70 1Files /scm/gopher-validator/files.gph bitreich.org 70 1Refs /scm/gopher-validator/refs.gph bitreich.org 70 1Tags /scm/gopher-validator/tag bitreich.org 70 1README /scm/gopher-validator/file/README.gph bitreich.org 70 1LICENSE /scm/gopher-validator/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit a230aa92f5f19ff3160fd7cdc7acc2810a02839a /scm/gopher-validator/commit/a230aa92f5f19ff3160fd7cdc7acc2810a02839a.gph bitreich.org 70 1parent d2d0e95268db4d42a56e0b8967af42b146a3a7e3 /scm/gopher-validator/commit/d2d0e95268db4d42a56e0b8967af42b146a3a7e3.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Fri, 18 Feb 2022 14:27:52 +0100 Err bitreich.org 70 i Err bitreich.org 70 iuse a binary search for checking the gopher type file extensions Err bitreich.org 70 i Err bitreich.org 70 i... and improve a check which shouldve been outside the loop. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M gopher-validator.c | 35 ++++++++++++++++++------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 20 insertions(+), 15 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/gopher-validator.c b/gopher-validator.c /scm/gopher-validator/file/gopher-validator.c.gph bitreich.org 70 i@@ -133,6 +133,13 @@ warning(const char *fmt, ...) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i+gophertypecmp(const void *v1, const void *v2) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return strcasecmp(((struct gophertype *)v1)->ext, Err bitreich.org 70 i+ ((struct gophertype *)v2)->ext); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i isvalidhost(const char *s) Err bitreich.org 70 i { Err bitreich.org 70 i int colons; Err bitreich.org 70 i@@ -220,6 +227,7 @@ edial(const char *host, const char *port) Err bitreich.org 70 i void Err bitreich.org 70 i checkdir(FILE *fp) Err bitreich.org 70 i { Err bitreich.org 70 i+ struct gophertype gt, *rgt; Err bitreich.org 70 i struct visited v; Err bitreich.org 70 i char line[1024], *end, *s; Err bitreich.org 70 i size_t linenr; Err bitreich.org 70 i@@ -333,21 +341,18 @@ checkdir(FILE *fp) Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- /* check type with file extension */ Err bitreich.org 70 i- if ((s = strrchr(v.path, '.')) && !strchr(s, '/')) { Err bitreich.org 70 i- s++; Err bitreich.org 70 i- for (i = 0; i < sizeof(types) / sizeof(*types); i++) { Err bitreich.org 70 i- if (primarytype == 'h' && Err bitreich.org 70 i- !strncmp(v.path, "URL:", sizeof("URL:") - 1)) Err bitreich.org 70 i- continue; Err bitreich.org 70 i- Err bitreich.org 70 i- if (!strcasecmp(s, types[i].ext) && Err bitreich.org 70 i- !strchr(types[i].allow, primarytype)) { Err bitreich.org 70 i- warning("%zu: invalid type '%c' for extension '%s', valid types: '%s'\n", Err bitreich.org 70 i- linenr, primarytype, types[i].ext, types[i].allow); Err bitreich.org 70 i- break; Err bitreich.org 70 i- } Err bitreich.org 70 i- } Err bitreich.org 70 i+ /* check type with file extension, unless it is the HTML 'h' Err bitreich.org 70 i+ type with a "URL:" prefix */ Err bitreich.org 70 i+ if ((s = strrchr(v.path, '.')) && !strchr(s, '/') && Err bitreich.org 70 i+ !(primarytype == 'h' && !strncmp(v.path, "URL:", sizeof("URL:") - 1))) { Err bitreich.org 70 i+ gt.ext = ++s; Err bitreich.org 70 i+ if (!(rgt = bsearch(>, &types, sizeof(types) / sizeof(types[0]), Err bitreich.org 70 i+ sizeof(types[0]), &gophertypecmp))) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!strchr(rgt->allow, primarytype)) Err bitreich.org 70 i+ warning("%zu: invalid type '%c' for extension '%s', valid types: '%s'\n", Err bitreich.org 70 i+ linenr, primarytype, rgt->ext, rgt->allow); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (!isvalidhost(v.host)) Err bitreich.org 70 .