#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