#include <stddef.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
static int in_set(
register const int c,
register const char * chars
) {
register int test;
while ((test = *chars)) {
if (c == test)
return 1;
++chars;
continue;
}
return 0;
}
char * rstrip(
register const char * const string,
register const char * const chars
) {
register char c;
register const char * cur_pos = string;
register const char * one_past_end = string + 1;
register ptrdiff_t diff;
register char * copy;
if (!chars) {
while ((c = *cur_pos)) {
one_past_end = cur_pos + 2;
++cur_pos;
continue;
}
} else {
while ((c = *cur_pos)) {
if (!in_set(c, chars))
one_past_end = cur_pos + 2;
++cur_pos;
continue;
}
}
diff = one_past_end - string;
if (!copy)
return NULL;
--diff;
copy[diff] = '\0';
return memcpy(copy
, string
, diff
); }
int main(void) {
char * tests[] = {
"",
" ",
" ",
"f",
" f",
" f",
" f ",
" f ",
"f ",
"f ",
"foo bar baz",
" foo bar baz",
" foo bar baz",
" foo bar baz ",
" foo bar baz ",
"foo bar baz ",
"foo bar baz ",
"mississippi",
};
int i;
char * stripped;
for (i = 0; i < (sizeof tests / sizeof *tests) - 1; ++i) {
stripped = rstrip(tests[i], NULL);
if (stripped)
continue;
}
stripped = rstrip(tests[i], "ipz");
if (stripped)
return EXIT_SUCCESS;
}
ICAjaW5jbHVkZSA8c3RkZGVmLmg+CiAgI2luY2x1ZGUgPGN0eXBlLmg+CiAgI2luY2x1ZGUgPHN0ZGxpYi5oPgogICNpbmNsdWRlIDxzdHJpbmcuaD4KICAjaW5jbHVkZSA8c3RkaW8uaD4KICAKICBzdGF0aWMgaW50IGluX3NldCgKICAgICAgcmVnaXN0ZXIgY29uc3QgaW50IGMsCiAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKiBjaGFycwogICAgKSB7CiAgICAgIHJlZ2lzdGVyIGludCB0ZXN0OwoKICAgICAgd2hpbGUgKCh0ZXN0ID0gKmNoYXJzKSkgewogICAgICAgICAgaWYgKGMgPT0gdGVzdCkKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICArK2NoYXJzOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0KCiAgY2hhciAqIHJzdHJpcCgKICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZywKICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqIGNvbnN0IGNoYXJzCiAgICApIHsKICAgICAgcmVnaXN0ZXIgY2hhciBjOwogICAgICByZWdpc3RlciBjb25zdCBjaGFyICogY3VyX3BvcyA9IHN0cmluZzsKICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqIG9uZV9wYXN0X2VuZCA9IHN0cmluZyArIDE7CiAgICAgIHJlZ2lzdGVyIHB0cmRpZmZfdCBkaWZmOwogICAgICByZWdpc3RlciBjaGFyICogY29weTsKCiAgICAgIGlmICghY2hhcnMpIHsKICAgICAgICAgIHdoaWxlICgoYyA9ICpjdXJfcG9zKSkgewogICAgICAgICAgICAgIGlmICghaXNzcGFjZShjKSkKICAgICAgICAgICAgICAgIG9uZV9wYXN0X2VuZCA9IGN1cl9wb3MgKyAyOwogICAgICAgICAgICAgICsrY3VyX3BvczsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aGlsZSAoKGMgPSAqY3VyX3BvcykpIHsKICAgICAgICAgICAgICBpZiAoIWluX3NldChjLCBjaGFycykpCiAgICAgICAgICAgICAgICBvbmVfcGFzdF9lbmQgPSBjdXJfcG9zICsgMjsKICAgICAgICAgICAgICArK2N1cl9wb3M7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGRpZmYgPSBvbmVfcGFzdF9lbmQgLSBzdHJpbmc7CiAgICAgIGNvcHkgPSBtYWxsb2MoZGlmZik7CiAgICAgIGlmICghY29weSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgIC0tZGlmZjsKICAgICAgY29weVtkaWZmXSA9ICdcMCc7CiAgICAgIHJldHVybiBtZW1jcHkoY29weSwgc3RyaW5nLCBkaWZmKTsKICAgIH0KCiAgaW50IG1haW4odm9pZCkgewogICAgICBjaGFyICogdGVzdHNbXSA9IHsKICAgICAgICAgICIiLAogICAgICAgICAgIiAiLAogICAgICAgICAgIiAgICAgICAgIiwKICAgICAgICAgICJmIiwKICAgICAgICAgICIgZiIsCiAgICAgICAgICAiICAgZiIsCiAgICAgICAgICAiICAgZiAgICIsCiAgICAgICAgICAiICAgZiAiLAogICAgICAgICAgImYgICAiLAogICAgICAgICAgImYgIiwKICAgICAgICAgICJmb28gYmFyICAgYmF6IiwKICAgICAgICAgICIgZm9vIGJhciAgIGJheiIsCiAgICAgICAgICAiICAgICAgICAgICAgICAgICAgZm9vIGJhciAgIGJheiIsCiAgICAgICAgICAiICAgICAgICAgICAgICAgICAgZm9vIGJhciAgIGJheiAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICIgZm9vIGJhciAgIGJheiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgImZvbyBiYXIgICBiYXogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICJmb28gYmFyICAgYmF6ICIsCiAgICAgICAgICAibWlzc2lzc2lwcGkiLAogICAgICAgIH07CiAgICAgIGludCBpOwogICAgICBjaGFyICogc3RyaXBwZWQ7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiB0ZXN0cyAvIHNpemVvZiAqdGVzdHMpIC0gMTsgKytpKSB7CiAgICAgICAgICBzdHJpcHBlZCA9IHJzdHJpcCh0ZXN0c1tpXSwgTlVMTCk7CiAgICAgICAgICBpZiAoc3RyaXBwZWQpCiAgICAgICAgICAgIHByaW50ZigiWyVzXVxuIiwgc3RyaXBwZWQpOwogICAgICAgICAgZnJlZShzdHJpcHBlZCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIHN0cmlwcGVkID0gcnN0cmlwKHRlc3RzW2ldLCAiaXB6Iik7CiAgICAgIGlmIChzdHJpcHBlZCkKICAgICAgICBwcmludGYoIlslc11cbiIsIHN0cmlwcGVkKTsKICAgICAgZnJlZShzdHJpcHBlZCk7CgogICAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwogICAgfQo=