Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connections
Warning: mysqli::query(): Couldn't fetch mysqli in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\index.php on line 66
Article <vcd05n$q3mn$1@paganini.bofh.team>
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