#include <stdio.h>
#include <stdlib.h>
char* slice( const char* str, size_t length,
const size_t offset = 0,
const size_t copy = 1, const size_t skip = 0,
size_t remainder = 1 )
{
if( length <= offset ) return NULL;
length -= offset;
remainder = remainder > 0;
const size_t pair = copy + skip;
const size_t pairs = length / pair * pair;
remainder = length % pair * remainder;
char* src = (char*)str + offset;
char* new_str = (char*)malloc( pairs + remainder );
const char* end = src + pairs;
char* dst = new_str;
while( src < end )
{
for( size_t i = 0; i < copy; ++i )
dst[i] = src[i];
src += pair;
dst += copy;
}
for( size_t i = 0; i < remainder; ++i )
dst[i] = src[i];
dst[remainder] = 0;
return new_str;
}
int main()
{
puts( slice( "01234567", 8, 0, 1, 1 ) );
puts( slice( "%01234567", 9, 1, 1, 1 ) );
puts( slice( "%01%23%45%67", 12, 1, 2, 1 ) );
puts( slice( "%01%23%45%6789", 14, 1, 2, 1 ) );
puts( slice( "%01%23%45%6789", 14, 1, 2, 1, false ) );
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmNoYXIqIHNsaWNlKCBjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBsZW5ndGgsCiAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gMCwKICAgIGNvbnN0IHNpemVfdCBjb3B5ID0gMSwgY29uc3Qgc2l6ZV90IHNraXAgPSAwLAogICAgc2l6ZV90IHJlbWFpbmRlciA9IDEgKQp7CiAgICBpZiggbGVuZ3RoIDw9IG9mZnNldCApIHJldHVybiBOVUxMOwogICAgbGVuZ3RoIC09IG9mZnNldDsKICAgIAogICAgcmVtYWluZGVyICAgICAgICAgICAgICAgPSByZW1haW5kZXIgPiAwOyAKICAgIGNvbnN0ICAgc2l6ZV90ICBwYWlyICAgID0gY29weSArIHNraXA7CiAgICBjb25zdCAgIHNpemVfdCAgcGFpcnMgICA9IGxlbmd0aCAvIHBhaXIgKiBwYWlyOwogICAgcmVtYWluZGVyICAgICAgICAgICAgICAgPSBsZW5ndGggJSBwYWlyICogcmVtYWluZGVyOwogICAgCiAgICBjaGFyKiAgICAgICAgICAgc3JjICAgICA9IChjaGFyKilzdHIgKyBvZmZzZXQ7CiAgICBjaGFyKiAgICAgICAgICAgbmV3X3N0ciA9IChjaGFyKiltYWxsb2MoIHBhaXJzICsgcmVtYWluZGVyICk7CiAgICBjb25zdCAgIGNoYXIqICAgZW5kICAgICA9IHNyYyArIHBhaXJzOwogICAgY2hhciogICAgICAgICAgIGRzdCAgICAgPSBuZXdfc3RyOwoKICAgIHdoaWxlKCBzcmMgPCBlbmQgKQogICAgewogICAgICAgIGZvciggc2l6ZV90IGkgPSAwOyBpIDwgY29weTsgKytpICkKICAgICAgICAgICAgZHN0W2ldID0gc3JjW2ldOwogICAgICAgIHNyYyArPSBwYWlyOwogICAgICAgIGRzdCArPSBjb3B5OwogICAgfQoKICAgIGZvciggc2l6ZV90IGkgPSAwOyBpIDwgcmVtYWluZGVyOyArK2kgKQogICAgICAgIGRzdFtpXSA9IHNyY1tpXTsKICAgIGRzdFtyZW1haW5kZXJdID0gMDsKCiAgICByZXR1cm4gbmV3X3N0cjsgCn0KCmludCBtYWluKCkKewogICAgcHV0cyggc2xpY2UoICIwMTIzNDU2NyIsIDgsIDAsIDEsIDEgKSApOwogICAgcHV0cyggc2xpY2UoICIlMDEyMzQ1NjciLCA5LCAxLCAxLCAxICkgKTsKICAgIHB1dHMoIHNsaWNlKCAiJTAxJTIzJTQ1JTY3IiwgMTIsIDEsIDIsIDEgKSApOwogICAgcHV0cyggc2xpY2UoICIlMDElMjMlNDUlNjc4OSIsIDE0LCAxLCAyLCAxICkgKTsKICAgIHB1dHMoIHNsaWNlKCAiJTAxJTIzJTQ1JTY3ODkiLCAxNCwgMSwgMiwgMSwgZmFsc2UgKSApOwoJcmV0dXJuIDA7Cn0=