From: Junio C Hamano Date: Fri, 19 Jul 2013 19:59:43 GMT Subject: Re: [PATCH v6 2/4] config: improve support for http..* settings Message-ID: <7vehauuxqo.fsf@alter.siamese.dyndns.org> In-Reply-To: <2cca0770a1e8495ac1418834c57f23d@f74d39fa044aa309eaea14b9f57fe79> "Kyle J. McKay" writes: > +#define URL_ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" > +#define URL_DIGIT "0123456789" > +#define URL_HEXDIGIT URL_DIGIT "ABCDEFabcdef" > +#define URL_ALPHADIGIT URL_ALPHA URL_DIGIT > +#define URL_SCHEME_CHARS URL_ALPHADIGIT "+.-" > +#define URL_HOST_CHARS URL_ALPHADIGIT ".-[:]" /* IPv6 literals need [:] */ > +#define URL_UNSAFE_CHARS " <>\"%{}|\\^`" /* plus 0x00-0x1F,0x7F-0xFF */ > +#define URL_GEN_RESERVED ":/?#[]@" > +#define URL_SUB_RESERVED "!$&'()*+,;=" > +#define URL_RESERVED URL_GEN_RESERVED URL_SUB_RESERVED /* only allowed delims */ > + ... > + while (from_len) { > + int ch = *from++; > + int was_esc = 0; > + > + from_len--; > + if (ch == '%') { > + if (from_len < 2 || > + !strchr(URL_HEXDIGIT, from[0]) || > + !strchr(URL_HEXDIGIT, from[1])) I actually do like the readability of the approach in this patch, but these repeated strchrs() in a loop may want to be optimized, using a trick similar to what is used in ctype.c::sane_ctype[]. A small build-time-only program or script gen-http-ctype.perl that defines and uses these URL_* cpp macros and generates a C source file http-ctype-gen.c that can be #included from http.c, with something like this in the Makefile: http-ctype-gen.c: gen-http-ctype.perl rm -f $@ $@+ $(PERL_PATH) gen-http-ctype.perl >$@+ mv $@+ $@ http.o: http.c http-ctype-gen.c would give us both readability and efficiency, perhaps?