  #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)) {
              if (!isspace(c))
                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;
      copy = malloc(diff);
      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)
            printf("[%s]\n", stripped);
          free(stripped);
          continue;
        }
      stripped = rstrip(tests[i], "ipz");
      if (stripped)
        printf("[%s]\n", stripped);
      free(stripped);

      return EXIT_SUCCESS;
    }
