#include <stdio.h>
#include <stdlib.h>
char * trim( char * str)
{
size_t len = 0 ;
char * frontp = str;
char * endp = NULL;
if ( str == NULL ) { return NULL; }
if ( str[ 0 ] == '\0 ' ) { return str; }
endp = str + len;
/* Move the front and back pointers to address the first non-whitespace
* characters from each end.
*/
while ( isspace ( ( unsigned char ) * frontp
) ) { ++ frontp
; } if ( endp != frontp )
{
while ( isspace ( ( unsigned char ) * ( -- endp
) ) && endp
!= frontp
) { } }
if ( str + len - 1 != endp )
* ( endp + 1 ) = '\0 ' ;
else if ( frontp != str && endp == frontp )
* str = '\0 ' ;
/* Shift the string so that it starts at str so that if it's dynamically
* allocated, we can still free it on the returned pointer. Note the reuse
* of endp to mean the front of the string buffer now.
*/
endp = str;
if ( frontp != str )
{
while ( * frontp ) { * endp++ = * frontp++; }
* endp = '\0 ' ;
}
return str;
}
int main( int argc, char * argv[ ] )
{
char * sample_strings[ ] =
{
"nothing to trim" ,
" trim the front" ,
"trim the back " ,
" trim one char front and back " ,
" trim one char front" ,
"trim one char back " ,
" " ,
" " ,
"\n \n \n Newlines in the front" ,
"Newlines in the back\n \n \n " ,
"\n One newline in front" ,
"One newline in back\n " ,
"\n \n \n \n \n \n \n \n \n " ,
"\n " ,
"a" ,
"" ,
NULL
} ;
char test_buffer[ 64 ] ;
int index;
for ( index = 0 ; sample_strings[ index] != NULL; ++ index )
{
strcpy ( test_buffer
, sample_strings
[ index
] ) ; printf ( "[%s] -> [%s]\n " , sample_strings
[ index
] , trim( test_buffer) ) ;
}
/* The test prints the following:
[nothing to trim] -> [nothing to trim]
[ trim the front] -> [trim the front]
[trim the back ] -> [trim the back]
[ trim one char front and back ] -> [trim one char front and back]
[ trim one char front] -> [trim one char front]
[trim one char back ] -> [trim one char back]
[ ] -> []
[ ] -> []
[a] -> [a]
[] -> []
*/
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmNoYXIgKnRyaW0oY2hhciAqc3RyKQp7CiAgICBzaXplX3QgbGVuID0gMDsKICAgIGNoYXIgKmZyb250cCA9IHN0cjsKICAgIGNoYXIgKmVuZHAgPSBOVUxMOwoKICAgIGlmKCBzdHIgPT0gTlVMTCApIHsgcmV0dXJuIE5VTEw7IH0KICAgIGlmKCBzdHJbMF0gPT0gJ1wwJyApIHsgcmV0dXJuIHN0cjsgfQoKICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgZW5kcCA9IHN0ciArIGxlbjsKCiAgICAvKiBNb3ZlIHRoZSBmcm9udCBhbmQgYmFjayBwb2ludGVycyB0byBhZGRyZXNzIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZQogICAgICogY2hhcmFjdGVycyBmcm9tIGVhY2ggZW5kLgogICAgICovCiAgICB3aGlsZSggaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKmZyb250cCkgKSB7ICsrZnJvbnRwOyB9CiAgICBpZiggZW5kcCAhPSBmcm9udHAgKQogICAgewogICAgICAgIHdoaWxlKCBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqKC0tZW5kcCkpICYmIGVuZHAgIT0gZnJvbnRwICkge30KICAgIH0KCiAgICBpZiggc3RyICsgbGVuIC0gMSAhPSBlbmRwICkKICAgICAgICAgICAgKihlbmRwICsgMSkgPSAnXDAnOwogICAgZWxzZSBpZiggZnJvbnRwICE9IHN0ciAmJiAgZW5kcCA9PSBmcm9udHAgKQogICAgICAgICAgICAqc3RyID0gJ1wwJzsKCiAgICAvKiBTaGlmdCB0aGUgc3RyaW5nIHNvIHRoYXQgaXQgc3RhcnRzIGF0IHN0ciBzbyB0aGF0IGlmIGl0J3MgZHluYW1pY2FsbHkKICAgICAqIGFsbG9jYXRlZCwgd2UgY2FuIHN0aWxsIGZyZWUgaXQgb24gdGhlIHJldHVybmVkIHBvaW50ZXIuICBOb3RlIHRoZSByZXVzZQogICAgICogb2YgZW5kcCB0byBtZWFuIHRoZSBmcm9udCBvZiB0aGUgc3RyaW5nIGJ1ZmZlciBub3cuCiAgICAgKi8KICAgIGVuZHAgPSBzdHI7CiAgICBpZiggZnJvbnRwICE9IHN0ciApCiAgICB7CiAgICAgICAgICAgIHdoaWxlKCAqZnJvbnRwICkgeyAqZW5kcCsrID0gKmZyb250cCsrOyB9CiAgICAgICAgICAgICplbmRwID0gJ1wwJzsKICAgIH0KCgogICAgcmV0dXJuIHN0cjsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgY2hhciAqc2FtcGxlX3N0cmluZ3NbXSA9CiAgICB7CiAgICAgICAgICAgICJub3RoaW5nIHRvIHRyaW0iLAogICAgICAgICAgICAiICAgIHRyaW0gdGhlIGZyb250IiwKICAgICAgICAgICAgInRyaW0gdGhlIGJhY2sgICAgICIsCiAgICAgICAgICAgICIgdHJpbSBvbmUgY2hhciBmcm9udCBhbmQgYmFjayAiLAogICAgICAgICAgICAiIHRyaW0gb25lIGNoYXIgZnJvbnQiLAogICAgICAgICAgICAidHJpbSBvbmUgY2hhciBiYWNrICIsCiAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgIiAiLAogICAgICAgICAgICAiXG5cblxuTmV3bGluZXMgaW4gdGhlIGZyb250IiwKICAgICAgICAgICAgIk5ld2xpbmVzIGluIHRoZSBiYWNrXG5cblxuIiwKICAgICAgICAgICAgIlxuT25lIG5ld2xpbmUgaW4gZnJvbnQiLAogICAgICAgICAgICAiT25lIG5ld2xpbmUgaW4gYmFja1xuIiwKICAgICAgICAgICAgIlxuXG5cblxuXG5cblxuXG5cbiIsCiAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICJhIiwKICAgICAgICAgICAgIiIsCiAgICAgICAgICAgIE5VTEwKICAgIH07CiAgICBjaGFyIHRlc3RfYnVmZmVyWzY0XTsKICAgIGludCBpbmRleDsKCiAgICBmb3IoIGluZGV4ID0gMDsgc2FtcGxlX3N0cmluZ3NbaW5kZXhdICE9IE5VTEw7ICsraW5kZXggKQogICAgewogICAgICAgICAgICBzdHJjcHkoIHRlc3RfYnVmZmVyLCBzYW1wbGVfc3RyaW5nc1tpbmRleF0gKTsKICAgICAgICAgICAgcHJpbnRmKCJbJXNdIC0+IFslc11cbiIsIHNhbXBsZV9zdHJpbmdzW2luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaW0odGVzdF9idWZmZXIpKTsKICAgIH0KCiAgICAvKiBUaGUgdGVzdCBwcmludHMgdGhlIGZvbGxvd2luZzoKICAgIFtub3RoaW5nIHRvIHRyaW1dIC0+IFtub3RoaW5nIHRvIHRyaW1dCiAgICBbICAgIHRyaW0gdGhlIGZyb250XSAtPiBbdHJpbSB0aGUgZnJvbnRdCiAgICBbdHJpbSB0aGUgYmFjayAgICAgXSAtPiBbdHJpbSB0aGUgYmFja10KICAgIFsgdHJpbSBvbmUgY2hhciBmcm9udCBhbmQgYmFjayBdIC0+IFt0cmltIG9uZSBjaGFyIGZyb250IGFuZCBiYWNrXQogICAgWyB0cmltIG9uZSBjaGFyIGZyb250XSAtPiBbdHJpbSBvbmUgY2hhciBmcm9udF0KICAgIFt0cmltIG9uZSBjaGFyIGJhY2sgXSAtPiBbdHJpbSBvbmUgY2hhciBiYWNrXQogICAgWyAgICAgICAgICAgICAgICAgICBdIC0+IFtdCiAgICBbIF0gLT4gW10KICAgIFthXSAtPiBbYV0KICAgIFtdIC0+IFtdCiAgICAqLwoKICAgIHJldHVybiAwOwp9