#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_segment( char * s, int idx)
{
printf ( "Segment[%d] → %s\n " , idx
, s
) ; }
void strsplit( char * str, char * delim, int limit, void ( * cb) ( char * s, int idx) )
{
char * search = strdup( str) ;
if ( limit == 1 ) {
cb( search, 0 ) ;
}
else {
int i
= 0 , count
= 0 , len
= strlen ( str
) , len_delim
= strlen ( delim
) ; char * segment = NULL, * leftover = NULL;
limit = limit > 0 ? limit - 1 : len;
segment
= strtok ( search
, delim
) ; for ( i = 0 ; segment != NULL && i < limit; i++ ) {
count
+= strlen ( segment
) + len_delim
; cb( segment, i) ;
segment
= strtok ( NULL
, delim
) ; }
if ( len != limit && count < len) {
leftover
= ( char * ) malloc ( len
- count
+ 1 ) ; memcpy ( leftover
, str
+ count
, len
- count
) ; leftover[ len - count] = '\0 ' ;
cb( leftover, i) ;
}
}
}
int main( int argc, char * argv[ ] )
{
printf ( "\n Split \" a;b;c;d\" limit 0\n " ) ; strsplit( "a;b;c;d" , ";" , 0 , print_segment) ;
printf ( "\n Split \" a;b;c;d\" limit 1\n " ) ; strsplit( "a;b;c;d" , ";" , 1 , print_segment) ;
printf ( "\n Split \" a;b;c;d\" limit 2\n " ) ; strsplit( "a;b;c;d" , ";" , 2 , print_segment) ;
printf ( "\n Split \" a;b;c;d\" limit 3\n " ) ; strsplit( "a;b;c;d" , ";" , 3 , print_segment) ;
printf ( "\n Split \" a;b;c;d\" limit 4\n " ) ; strsplit( "a;b;c;d" , ";" , 4 , print_segment) ;
printf ( "\n Split \" a;b;c;d\" limit 5\n " ) ; strsplit( "a;b;c;d" , ";" , 5 , print_segment) ;
printf ( "\n Split \" a;b;c;d\" limit 6\n " ) ; strsplit( "a;b;c;d" , ";" , 6 , print_segment) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdm9pZCBwcmludF9zZWdtZW50KGNoYXIgKnMsIGludCBpZHgpCnsKICBwcmludGYoIlNlZ21lbnRbJWRdIOKGkiAlc1xuIiwgaWR4LCBzKTsKfQoKdm9pZCBzdHJzcGxpdChjaGFyICpzdHIsIGNoYXIgKmRlbGltLCBpbnQgbGltaXQsIHZvaWQgKCpjYikoY2hhciAqcywgaW50IGlkeCkpCnsKICBjaGFyICpzZWFyY2ggPSBzdHJkdXAoc3RyKTsKCiAgaWYgKGxpbWl0ID09IDEpIHsKICAgIGNiKHNlYXJjaCwgMCk7CiAgfQogIGVsc2UgewogICAgaW50IGkgPSAwLCBjb3VudCA9IDAsIGxlbiA9IHN0cmxlbihzdHIpLCBsZW5fZGVsaW0gPSBzdHJsZW4oZGVsaW0pOwogICAgY2hhciAqc2VnbWVudCA9IE5VTEwsICpsZWZ0b3ZlciA9IE5VTEw7CiAgICBsaW1pdCA9IGxpbWl0ID4gMCA/IGxpbWl0IC0gMSA6IGxlbjsKCiAgICBzZWdtZW50ID0gc3RydG9rKHNlYXJjaCwgZGVsaW0pOwogICAgZm9yIChpID0gMDsgc2VnbWVudCAhPSBOVUxMICYmIGkgPCBsaW1pdDsgaSsrKSB7CiAgICAgIGNvdW50ICs9IHN0cmxlbihzZWdtZW50KSArIGxlbl9kZWxpbTsKICAgICAgY2Ioc2VnbWVudCwgaSk7CiAgICAgIHNlZ21lbnQgPSBzdHJ0b2soTlVMTCwgZGVsaW0pOwogICAgfQoKICAgIGlmIChsZW4gIT0gbGltaXQgJiYgY291bnQgPCBsZW4pIHsKICAgICAgbGVmdG92ZXIgPSAoY2hhciopIG1hbGxvYyhsZW4gLSBjb3VudCArIDEpOwogICAgICBtZW1jcHkobGVmdG92ZXIsIHN0ciArIGNvdW50LCBsZW4gLSBjb3VudCk7CiAgICAgIGxlZnRvdmVyW2xlbiAtIGNvdW50XSA9ICdcMCc7CiAgICAgIGNiKGxlZnRvdmVyLCBpKTsKICAgICAgZnJlZShsZWZ0b3Zlcik7CiAgICB9CiAgfQp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgcHJpbnRmKCJcblNwbGl0IFwiYTtiO2M7ZFwiIGxpbWl0IDBcbiIpOwogIHN0cnNwbGl0KCJhO2I7YztkIiwgIjsiLCAwLCBwcmludF9zZWdtZW50KTsKCiAgcHJpbnRmKCJcblNwbGl0IFwiYTtiO2M7ZFwiIGxpbWl0IDFcbiIpOwogIHN0cnNwbGl0KCJhO2I7YztkIiwgIjsiLCAxLCBwcmludF9zZWdtZW50KTsKCiAgcHJpbnRmKCJcblNwbGl0IFwiYTtiO2M7ZFwiIGxpbWl0IDJcbiIpOwogIHN0cnNwbGl0KCJhO2I7YztkIiwgIjsiLCAyLCBwcmludF9zZWdtZW50KTsKCiAgcHJpbnRmKCJcblNwbGl0IFwiYTtiO2M7ZFwiIGxpbWl0IDNcbiIpOwogIHN0cnNwbGl0KCJhO2I7YztkIiwgIjsiLCAzLCBwcmludF9zZWdtZW50KTsKCiAgcHJpbnRmKCJcblNwbGl0IFwiYTtiO2M7ZFwiIGxpbWl0IDRcbiIpOwogIHN0cnNwbGl0KCJhO2I7YztkIiwgIjsiLCA0LCBwcmludF9zZWdtZW50KTsKCiAgcHJpbnRmKCJcblNwbGl0IFwiYTtiO2M7ZFwiIGxpbWl0IDVcbiIpOwogIHN0cnNwbGl0KCJhO2I7YztkIiwgIjsiLCA1LCBwcmludF9zZWdtZW50KTsKCiAgcHJpbnRmKCJcblNwbGl0IFwiYTtiO2M7ZFwiIGxpbWl0IDZcbiIpOwogIHN0cnNwbGl0KCJhO2I7YztkIiwgIjsiLCA2LCBwcmludF9zZWdtZW50KTsKCiAgcmV0dXJuIDA7Cn0K