#include <stdio.h>
#include <stddef.h>
#include <ctype.h>
#define MAX_STR_LEN 50
void to_camel_case( char * str)
{
int idx = 0 ;
int newIdx = 0 ;
int wasUnderscore = 0 ;
// just to be on the safe side
if ( ! str
|| strlen ( str
) >= MAX_STR_LEN
) return ;
while ( str[ idx] )
{
if ( str[ idx] == '_' )
{
idx++;
// no copy in this case, just raise a flag that '_' was met
wasUnderscore = 1 ;
}
else if ( wasUnderscore)
{
// next letter after the '_' should be uppercased
str
[ newIdx
++ ] = toupper ( str
[ idx
++ ] ) ; // drop the flag which indicates that '_' was met
wasUnderscore = 0 ;
}
else
{
// copy the character and increment the indices
str[ newIdx++ ] = str[ idx++ ] ;
}
}
str[ newIdx] = '\0 ' ;
}
int main( void ) {
char words[ ] [ MAX_STR_LEN] = { "hello_world" , "hello___world" , "hel_lo_wo_rld__" , "__hello_world__" } ;
for ( int i = 0 ; i < sizeof ( words) / sizeof ( words[ 0 ] ) ; ++ i)
{
printf ( "String %s became " , words
[ i
] ) ; to_camel_case( words[ i] ) ;
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojZGVmaW5lIE1BWF9TVFJfTEVOIDUwCgp2b2lkIHRvX2NhbWVsX2Nhc2UoY2hhciAqc3RyKQp7CiAgICBpbnQgaWR4ID0gMDsKICAgIGludCBuZXdJZHggPSAwOwogICAgaW50IHdhc1VuZGVyc2NvcmUgPSAwOwoKICAgIC8vIGp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZQogICAgaWYgKCFzdHIgfHwgc3RybGVuKHN0cikgPj0gTUFYX1NUUl9MRU4pCiAgICAgICAgcmV0dXJuOwoKICAgIHdoaWxlIChzdHJbaWR4XSkKICAgIHsKICAgICAgICBpZiAoc3RyW2lkeF0gPT0gJ18nKQogICAgICAgIHsKICAgICAgICAJaWR4Kys7CiAgICAgICAgICAgIC8vIG5vIGNvcHkgaW4gdGhpcyBjYXNlLCBqdXN0IHJhaXNlIGEgZmxhZyB0aGF0ICdfJyB3YXMgbWV0CiAgICAgICAgICAgIHdhc1VuZGVyc2NvcmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh3YXNVbmRlcnNjb3JlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbmV4dCBsZXR0ZXIgYWZ0ZXIgdGhlICdfJyBzaG91bGQgYmUgdXBwZXJjYXNlZAogICAgICAgICAgICBzdHJbbmV3SWR4KytdID0gdG91cHBlcihzdHJbaWR4KytdKTsKICAgICAgICAgICAgLy8gZHJvcCB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgdGhhdCAnXycgd2FzIG1ldAogICAgICAgICAgICB3YXNVbmRlcnNjb3JlID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy8gY29weSB0aGUgY2hhcmFjdGVyIGFuZCBpbmNyZW1lbnQgdGhlIGluZGljZXMKICAgICAgICAgICAgc3RyW25ld0lkeCsrXSA9IHN0cltpZHgrK107CiAgICAgICAgfQogICAgfQoKICAgIHN0cltuZXdJZHhdID0gJ1wwJzsKfQoKaW50IG1haW4odm9pZCkgewoJCgljaGFyIHdvcmRzW11bTUFYX1NUUl9MRU5dID0geyJoZWxsb193b3JsZCIsICJoZWxsb19fX3dvcmxkIiwgImhlbF9sb193b19ybGRfXyIsICJfX2hlbGxvX3dvcmxkX18ifTsKCQoJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2Yod29yZHMpL3NpemVvZih3b3Jkc1swXSk7ICsraSkKCXsKCQlwcmludGYoIlN0cmluZyAlcyBiZWNhbWUgIiwgd29yZHNbaV0pOwoJCXRvX2NhbWVsX2Nhc2Uod29yZHNbaV0pOwoJCXByaW50ZigiJXNcbiIsIHdvcmRzW2ldKTsKCX0KCQoJcmV0dXJuIDA7Cn0K