* @param breakOnCap
   * @param breakOnNumber
   * @param breakOnSeparators
   * @return Cons
   */
  public static Cons decomposeNamestringFull(String namestring, Keyword breakOnCap, Keyword breakOnNumber, String breakOnSeparators) {
    { int len = namestring.length();
      Cons result = Stella.NIL;
      int lag = 0;
      int lead = 0;
      boolean incaprunP = false;
      boolean innumberP = false;

      { char c = Stella.NULL_CHARACTER;
        String vector000 = namestring;
        int index000 = 0;
        int length000 = vector000.length();

        for (;index000 < length000; index000 = index000 + 1) {
          c = vector000.charAt(index000);
          { boolean foundP000 = false;

            { char sep = Stella.NULL_CHARACTER;
              String vector001 = breakOnSeparators;
              int index001 = 0;
              int length001 = vector001.length();

              loop001 : for (;index001 < length001; index001 = index001 + 1) {
                sep = vector001.charAt(index001);
                if (sep == c) {
                  foundP000 = true;
                  break loop001;
                }
              }
            }
            if (foundP000) {
              {
                result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead)), result);
                lag = lead + 1;
                innumberP = false;
                incaprunP = false;
              }
            }
            else {
              if (lag > lead) {
                {
                }
              }
              else {
                if (Stella.$CHARACTER_TYPE_TABLE$[(int) c] == Stella.KWD_DIGIT) {
                  {
                    if ((!innumberP) &&
                        (!(breakOnNumber == Stella.KWD_NO))) {
                      if (!(lead == lag)) {
                        result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead)), result);
                        lag = lead;
                      }
                    }
                    else {
                    }
                    incaprunP = false;
                    innumberP = true;
                  }
                }
                else {
                  if (Stella.lowerCaseCharacterP(c)) {
                    {
                      if (innumberP &&
                          (!(breakOnNumber == Stella.KWD_NO))) {
                        if (lead == lag) {
                        }
                        else if (!(breakOnNumber == Stella.KWD_CLEVER)) {
                          result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead)), result);
                          lag = lead;
                        }
                        else if ((lead < (len - 1)) &&
                            Stella.ordinalNumberStringP(Native.string_subsequence(namestring, lag, lead + 2))) {
                          result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead + 2)), result);
                          lag = lead + 2;
                        }
                        else {
                          result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead)), result);
                          lag = lead;
                        }
                      }
                      if (lag > lead) {
                      }
                      else if (breakOnCap == Stella.KWD_NO) {
                      }
                      else if (!(breakOnCap == Stella.KWD_CLEVER)) {
                      }
                      else if (incaprunP) {
                        if (!(lead == (lag + 1))) {
                          result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead - 1)), result);
                          lag = lead - 1;
                        }
                      }
                      innumberP = false;
                      incaprunP = false;
                    }
                  }
                  else {
                    if (Stella.upperCaseCharacterP(c)) {
                      if (innumberP &&
                          (!(breakOnNumber == Stella.KWD_NO))) {
                        if (lead == lag) {
                        }
                        else if (!(breakOnNumber == Stella.KWD_CLEVER)) {
                          result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead)), result);
                          lag = lead;
                        }
                        else if ((lead < (len - 1)) &&
                            Stella.ordinalNumberStringP(Native.string_subsequence(namestring, lag, lead + 2))) {
                          result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead + 2)), result);
                          lag = lead + 2;
                        }
                        else {
                          result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead)), result);
                          lag = lead;
                        }
                      }
                      if (lag > lead) {
                      }
                      else if (breakOnCap == Stella.KWD_NO) {
                      }
                      else if (!(breakOnCap == Stella.KWD_CLEVER)) {
                        if (!(lead == lag)) {
                          result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead)), result);
                          lag = lead;
                        }
                      }
                      else if (incaprunP) {
                      }
                      else {
                        if (!(lead == lag)) {
                          result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, lead)), result);
                          lag = lead;
                        }
                        incaprunP = true;
                      }
                      innumberP = false;
                    }
                  }
                }
              }
            }
          }
          lead = lead + 1;
        }
      }
      if (!(lead < lag)) {
        result = Cons.cons(StringWrapper.wrapString(Native.string_subsequence(namestring, lag, Stella.NULL_INTEGER)), result);
      }
      return (result.reverse());
    }
  }