Deutsch English Français Italiano |
<vcd05n$q3mn$1@paganini.bofh.team> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.nobody.at!2.eu.feeder.erje.net!feeder.erje.net!newsfeed.bofh.team!paganini.bofh.team!not-for-mail From: antispam@fricas.org Newsgroups: comp.lang.c Subject: Re: Command line globber/tokenizer library for C? Date: Tue, 17 Sep 2024 22:34:33 -0000 (UTC) Organization: To protect and to server Message-ID: <vcd05n$q3mn$1@paganini.bofh.team> References: <lkbjchFebk9U1@mid.individual.net> <vbsmlb$3o6n2$1@raubtier-asyl.eternal-september.org> <vbsu1d$3p7pp$1@dont-email.me> <vbtj88$1kpm$1@raubtier-asyl.eternal-september.org> <vbujak$733i$3@dont-email.me> <vbum9i$8h2o$1@dont-email.me> <vbur72$99cr$1@dont-email.me> <20240912181625.00006e68@yahoo.com> <vbv4ra$b0hv$2@dont-email.me> <vbv6r1$bhc9$1@raubtier-asyl.eternal-september.org> <20240912223828.00005c10@yahoo.com> <861q1nfsjz.fsf@linuxsc.com> <20240915122211.000058b1@yahoo.com> Injection-Date: Tue, 17 Sep 2024 22:34:33 -0000 (UTC) Injection-Info: paganini.bofh.team; logging-data="855767"; posting-host="WwiNTD3IIceGeoS5hCc4+A.user.paganini.bofh.team"; mail-complaints-to="usenet@bofh.team"; posting-account="9dIQLXBM7WM9KzA+yjdR4A"; User-Agent: tin/2.6.2-20221225 ("Pittyvaich") (Linux/6.1.0-9-amd64 (x86_64)) X-Notice: Filtered by postfilter v. 0.9.3 Bytes: 3461 Lines: 66 Michael S <already5chosen@yahoo.com> wrote: > On Fri, 13 Sep 2024 09:05:04 -0700 > Tim Rentsch <tr.17687@z991.linuxsc.com> wrote: > >> Michael S <already5chosen@yahoo.com> writes: >> >> [..iterate over words in a string..] >> >> I couldn't resist writing some code along similar lines. The >> entry point is words_do(), which returns one on success and >> zero if the end of string is reached inside double quotes. >> >> >> typedef struct gopher_s *Gopher; >> struct gopher_s { void (*f)( Gopher, const char *, const char * ); }; >> >> static _Bool collect_word( const char *, const char *, _Bool, >> Gopher ); static _Bool is_space( char ); >> >> >> _Bool >> words_do( const char *s, Gopher go ){ >> char c = *s; >> >> return >> is_space(c) ? words_do( s+1, go ) >> : c ? collect_word( s, s, 1, go ) >> : /***************/ 1; >> } >> >> _Bool >> collect_word( const char *s, const char *r, _Bool w, Gopher go ){ >> char c = *s; >> >> return >> c == 0 ? go->f( go, r, s ), w >> : is_space(c) && w ? go->f( go, r, s ), words_do( s, go ) >> : /***************/ collect_word( s+1, r, w ^ c == '"', go ); >> } >> >> _Bool >> is_space( char c ){ >> return c == ' ' || c == '\t'; >> } > > <snip> > Tested on godbolt. > gcc -O2 turns it into iteration starting from v.4.4 > clang -O2 turns it into iteration starting from v.4.0 > Latest icc still does not turn it into iteration at least along one > code paths. > Latest MSVC implements it as written, 100% recursion. I tested using gcc 12. AFAICS calls to 'go->f' in 'collect_word' are not tail calls and gcc 12 compiles them as normal call. The other calls are compiled to jumps. But call to 'collect_word' in 'words_do' is not "sibicall" and dependig in calling convention compiler may treat it narmal call. Two other calls, that is call to 'words_do' in 'words_do' and call to 'collect_word' in 'collect_word' are clearly tail self recursion and compiler should always optimize them to a jump. -- Waldek Hebisch