public static boolean searchStringMatchP(String inputstring, Cons matchlist) {
    if (matchlist == Stella.NIL) {
      if (inputstring.length() == 0) {
        return (true);
      }
      else {
        return (false);
      }
    }
    if (Stella_Object.symbolP(matchlist.value)) {
      { StringWrapper firstnonwild = GuiServer.getFirstNonWild(matchlist);
        int matchpos = 0;
        String restofinput = null;

        if (firstnonwild == null) {
          return (true);
        }
        if ((matchpos = Native.stringSearch(inputstring, firstnonwild.wrapperValue, 0)) != Stella.NULL_INTEGER) {
          restofinput = Native.string_subsequence(inputstring, matchpos + (firstnonwild.wrapperValue).length(), inputstring.length());
          return (GuiServer.searchStringMatchP(restofinput, GuiServer.getRestAfterFirstNonWild(matchlist)));
        }
        return (false);
      }
    }
    else {
      { StringWrapper fragment = ((StringWrapper)(matchlist.value));

        if ((fragment.wrapperValue).length() > inputstring.length()) {
          return (false);
        }
        else {
          { String inputstart = Native.string_subsequence(inputstring, 0, (fragment.wrapperValue).length());
            String restofinput = Native.string_subsequence(inputstring, (fragment.wrapperValue).length(), inputstring.length());

            return (Stella.stringEqlP(fragment.wrapperValue, inputstart) &&
                GuiServer.searchStringMatchP(restofinput, matchlist.rest));
          }
        }
      }
    }
  }