#include <iostream>
#include <cstring>
using namespace std;
const char * findx( const char * str, const char * strx)
{
if ( ! ( str && strx) ) {
return nullptr;
}
const char * found = nullptr;
int s = 0 , x = 0 ;
while ( str[ s] ! = '\0 ' ) {
if ( ! found) {
found = & str[ s] ;
}
if ( strx[ x] == '\0 ' ) {
return found;
}
if ( str[ s] ! = strx[ x] ) {
found = nullptr;
s = s- x + 1 ;
x = 0 ;
}
else {
s++ ;
x++ ;
}
}
return nullptr;
}
struct string_or_null {
const char * str;
} ;
ostream& operator << ( ostream& o, const string_or_null& fh) {
if ( fh.str ) {
o << '"' << fh.str << '"' ;
}
else {
o << "nullptr" ;
}
return o;
}
pair< int ,int > test_findx( ) {
struct test_t {
const char * input;
const char * subject;
const char * expected;
test_t( const char * input, const char * subject, const int pos) {
this- > input = input;
this- > subject = subject;
this- > expected = ( pos == - 1 ) ? nullptr : ( input + pos) ;
}
} tests[ ] = {
test_t( "abc" , "abc" , 0 ) ,
test_t( "abcdef" , "abc" , 0 ) ,
test_t( "ababac" , "abac" , 2 ) ,
test_t( "ababac-----" , "abac" , 2 ) ,
test_t( "abc" , "xyz" , - 1 ) ,
test_t( "abc" , "" , - 1 ) ,
test_t( "" , "" , 0 ) ,
test_t( "" , "a" , - 1 ) ,
// ...
} ;
int total = sizeof ( tests) / sizeof ( tests[ 0 ] ) ;
int failed = 0 ;
for ( const auto & test : tests ) {
int test_no = & test - tests;
const char * result = findx( test.input , test.subject ) ;
if ( result ! = test.expected ) {
failed ++ ;
cout << "Test #" << test_no
<< " failed: " << string_or_null{ test.subject }
<< " in " << string_or_null{ test.input }
<< ", expected " << string_or_null{ test.expected }
<< ", got " << string_or_null{ result}
<< endl;
}
}
return { total, failed} ;
}
int main( ) {
pair< int ,int > result = test_findx( ) ;
cout << "Failed " << result.second << " of " << result.first << " tests." << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBjaGFyKiBmaW5keChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIHN0cngpCnsKCWlmICggIShzdHIgJiYgc3RyeCkgKSB7CgkJcmV0dXJuIG51bGxwdHI7Cgl9CgoJY29uc3QgY2hhciogZm91bmQgPSBudWxscHRyOwoJaW50IHMgPSAwLCB4ID0gMDsKCgl3aGlsZSAoc3RyW3NdICE9ICdcMCcpIHsKCQlpZiAoIWZvdW5kKSB7CgkJCWZvdW5kID0gJnN0cltzXTsKCQl9CgoJCWlmIChzdHJ4W3hdID09ICdcMCcpIHsKCQkJcmV0dXJuIGZvdW5kOwoJCX0KCgkJaWYgKHN0cltzXSAhPSBzdHJ4W3hdKSB7CgkJCWZvdW5kID0gbnVsbHB0cjsKCQkJcyA9IHMteCArMTsKCQkJeCA9IDA7CgkJfQoJCWVsc2UgewoJCQlzKys7CgkJCXgrKzsKCQl9Cgl9CgoJcmV0dXJuIG51bGxwdHI7Cn0KCgpzdHJ1Y3Qgc3RyaW5nX29yX251bGwgewoJY29uc3QgY2hhciogc3RyOwp9OwoKb3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBvc3RyZWFtJiBvLCBjb25zdCBzdHJpbmdfb3JfbnVsbCYgZmgpIHsKCWlmICggZmguc3RyICkgewoJCW8gPDwgJyInIDw8IGZoLnN0ciA8PCAnIic7Cgl9CgllbHNlIHsKCQlvIDw8ICJudWxscHRyIjsKCX0KCXJldHVybiBvOwp9CgpwYWlyPGludCxpbnQ+IHRlc3RfZmluZHgoKSB7CglzdHJ1Y3QgdGVzdF90IHsKCQljb25zdCBjaGFyKiBpbnB1dDsKCQljb25zdCBjaGFyKiBzdWJqZWN0OwoJCWNvbnN0IGNoYXIqIGV4cGVjdGVkOwoKCQl0ZXN0X3QoY29uc3QgY2hhciogaW5wdXQsIGNvbnN0IGNoYXIqIHN1YmplY3QsIGNvbnN0IGludCBwb3MpIHsKCQkJdGhpcy0+aW5wdXQgICAgPSBpbnB1dDsKCQkJdGhpcy0+c3ViamVjdCAgPSBzdWJqZWN0OwoJCQl0aGlzLT5leHBlY3RlZCA9ICggcG9zID09IC0xICkgPyBudWxscHRyIDogKGlucHV0ICsgcG9zKTsKCQl9Cgl9IHRlc3RzW10gPSB7CgkJdGVzdF90KCJhYmMiLCAgICAgICAgICJhYmMiLCAgMCksCgkJdGVzdF90KCJhYmNkZWYiLCAgICAgICJhYmMiLCAgMCksCgkJdGVzdF90KCJhYmFiYWMiLCAgICAgICJhYmFjIiwgMiksCgkJdGVzdF90KCJhYmFiYWMtLS0tLSIsICJhYmFjIiwgMiksCgoJCXRlc3RfdCgiYWJjIiwgICAgICAgICAieHl6IiwgIC0xKSwKCQl0ZXN0X3QoImFiYyIsICAgICAgICAgIiIsICAgICAtMSksCgkJdGVzdF90KCIiLCAgICAgICAgICAgICIiLCAgICAgMCksCgkJdGVzdF90KCIiLCAgICAgICAgICAgICJhIiwgICAgLTEpLAoKCQkvLyAuLi4KCX07CgoKCglpbnQgdG90YWwgPSBzaXplb2YodGVzdHMpL3NpemVvZih0ZXN0c1swXSk7CglpbnQgZmFpbGVkID0gMDsKCWZvciAoIGNvbnN0IGF1dG8mIHRlc3QgOiB0ZXN0cyApIHsKCQlpbnQgdGVzdF9ubyA9ICZ0ZXN0IC0gdGVzdHM7CgkJY29uc3QgY2hhciogcmVzdWx0ID0gZmluZHgodGVzdC5pbnB1dCwgdGVzdC5zdWJqZWN0KTsKCgkJaWYgKCByZXN1bHQgIT0gdGVzdC5leHBlY3RlZCApIHsKCQkJZmFpbGVkICsrOwoJCQljb3V0IDw8ICJUZXN0ICMiICAgPDwgdGVzdF9ubwoJCQkJPDwgIiBmYWlsZWQ6ICIgICA8PCBzdHJpbmdfb3JfbnVsbHt0ZXN0LnN1YmplY3R9CgkJCQk8PCAiIGluICIgICAgICAgIDw8IHN0cmluZ19vcl9udWxse3Rlc3QuaW5wdXR9CgkJCQk8PCAiLCBleHBlY3RlZCAiIDw8IHN0cmluZ19vcl9udWxse3Rlc3QuZXhwZWN0ZWR9CgkJCQk8PCAiLCBnb3QgIiAgICAgIDw8IHN0cmluZ19vcl9udWxse3Jlc3VsdH0KCQkJCTw8IGVuZGw7CgkJfQoJfQoKCXJldHVybiB7dG90YWwsIGZhaWxlZH07Cn0KCgppbnQgbWFpbigpIHsKCXBhaXI8aW50LGludD4gcmVzdWx0ID0gdGVzdF9maW5keCgpOwoJY291dCA8PCAiRmFpbGVkICIgPDwgcmVzdWx0LnNlY29uZCA8PCAiIG9mICIgPDwgcmVzdWx0LmZpcnN0IDw8ICIgdGVzdHMuIiA8PCBlbmRsOwp9Cg==