Exemplo n.º 1
0
  public void cmdProc(
      Interp interp, // Current interpreter.
      TclObject argv[]) // Argument list.
      throws TclException // If wrong number of args, a
        // standard Tcl exception;
        // If an exception is encountered
        // during the invokation of the method,
        // the Exception object will be stored
        // in the errorCode of the interp.
      {
    boolean convert;
    int optionIdx, numArgs;
    Object subArrayObj;
    Class subArrayClass;
    int option, index, numDims, count;
    TclObject indexListObj;

    if (argv.length < 2) {
      throw new TclNumArgsException(interp, 1, argv, "?-noconvert? option ?arg arg ...?");
    }

    String arg1 = argv[1].toString();
    if ((arg1.length() >= 2) && (NOCONVERT.startsWith(arg1))) {
      // numArgs is the number of optional arguments after the
      // sub-command.

      convert = false;
      optionIdx = 2;
      numArgs = argv.length - 3;
    } else {
      convert = true;
      optionIdx = 1;
      numArgs = argv.length - 2;
    }

    if (numArgs < 0) {
      throw new TclNumArgsException(interp, 1, argv, "?-noconvert? option ?arg arg ...?");
    }

    // If the <option> argument to the array object command is one of the
    // array sub-commands, then proceed to the switch statement below.
    // Otherwise, the array object behaves as a reflect object by calling
    // ReflectObject.cmdProc, and <option> will be treated as a method
    // of the array object.
    //
    // We can be sure that there is no conflect between the array
    // sub-commands and the method of the array object. This is
    // because the array object is an instance of java.lang.Object,
    // which has only the following methods (as of JDK 1.1): getClass,
    // hashCode, equals, wait, toString, notify, notifyAll

    try {
      option = TclIndex.get(interp, argv[optionIdx], validCmds, "option", TCL.EXACT);
    } catch (TclException e) {
      try {
        int startIdx = optionIdx + 1;

        FuncSig.get(
            interp, javaClass, argv[optionIdx], argv, startIdx, argv.length - startIdx, false);
      } catch (TclException e1) {
        throw new TclException(
            interp,
            "bad option \""
                + argv[optionIdx]
                + "\": must be length, get, getrange, "
                + "set, setrange, or a valid method signature");
      }

      super.cmdProc(interp, argv);
      return;
    }

    switch (option) {
      case OPT_LENGTH:
        if (numArgs != 0) {
          throw new TclNumArgsException(interp, optionIdx + 1, argv, "");
        }
        if (convert == false) {
          throw new TclException(
              interp, "-noconvert flag not allowed for the \"length\" sub-command");
        }
        interp.setResult(Array.getLength(javaObj));
        return;

      case OPT_GET:
        if (numArgs != 1) {
          throw new TclNumArgsException(interp, optionIdx + 1, argv, "indexList");
        }
        indexListObj = argv[optionIdx + 1];
        numDims = TclList.getLength(interp, indexListObj);
        if (numDims == 0) {
          subArrayObj = javaObj;
          subArrayClass = dereferenceClassDims(interp, javaClass, 1);
          index = 0;
        } else {
          // Dereference all but the last dimension specified. Set
          // the interpreter result to the index'th element of the
          // "subArrayObj".

          subArrayObj = dereferenceArrayDims(interp, javaObj, numDims, indexListObj);
          subArrayClass = dereferenceClassDims(interp, javaClass, numDims);
          index = TclInteger.getInt(interp, TclList.index(interp, indexListObj, numDims - 1));
        }

        // Set the interpreter result to a TclObject containing the index'th
        // element of "subArrayObj".

        interp.setResult(getArrayElt(interp, subArrayObj, subArrayClass, index, convert));
        return;

      case OPT_SET:
        if (numArgs != 2) {
          throw new TclNumArgsException(interp, optionIdx + 1, argv, "indexList value");
        }
        if (convert == false) {
          throw new TclException(interp, "-noconvert flag not allowed for the \"set\" sub-command");
        }

        indexListObj = argv[optionIdx + 1];
        numDims = TclList.getLength(interp, indexListObj);
        if (numDims == 0) {
          subArrayObj = javaObj;
          subArrayClass = dereferenceClassDims(interp, javaClass, 1);
          index = 0;
        } else {
          // Dereference all but the last dimension specified. Set
          // the value of index'th element of the "subArrayObj" to
          // the value in argv[optionIdx + 2].

          subArrayObj = dereferenceArrayDims(interp, javaObj, numDims, indexListObj);
          subArrayClass = dereferenceClassDims(interp, javaClass, numDims);
          index = TclInteger.getInt(interp, TclList.index(interp, indexListObj, numDims - 1));
        }

        // Set the value of the index'th element of "subArrayObj" to the
        // value
        // in the TclObject argv[optionIdx + 2].

        setArrayElt(interp, subArrayObj, subArrayClass, index, argv[optionIdx + 2]);
        interp.resetResult();
        return;

      case OPT_GETRANGE:
        if (numArgs > 2) {
          throw new TclNumArgsException(interp, optionIdx + 1, argv, "?indexList ?count??");
        }

        // If an index list is specified, dereference all but the last
        // dimension specified. If the index list is empty, getrange
        // behaves as an identity function and returns argv[0].

        subArrayObj = javaObj;
        subArrayClass = dereferenceClassDims(interp, javaClass, 1);
        index = 0;

        if (numArgs > 0) {
          indexListObj = argv[optionIdx + 1];
          numDims = TclList.getLength(interp, indexListObj);
          if (numDims > 0) {
            subArrayObj = dereferenceArrayDims(interp, javaObj, numDims, indexListObj);
            subArrayClass = dereferenceClassDims(interp, javaClass, numDims);
            index = TclInteger.getInt(interp, TclList.index(interp, indexListObj, numDims - 1));
          }
        }

        // The variable "count" represents the number of elements to
        // return. The default is the array size less the first index
        // (the remaining elements of the array). If a count is
        // specified and is smaller than the default, the default is
        // overridden.

        count = Array.getLength(subArrayObj) - index;
        if (numArgs > 1) {
          count = Math.min(count, TclInteger.getInt(interp, argv[optionIdx + 2]));
        }

        // Set the interpreter result to a TclList containing "count"
        // elements
        // of the "subArrayObj", starting with the index'th element.

        interp.setResult(getArrayElts(interp, subArrayObj, subArrayClass, index, count, convert));
        return;

      case OPT_SETRANGE:
        if ((numArgs < 1) || (numArgs > 3)) {
          throw new TclNumArgsException(
              interp, optionIdx + 1, argv, "?indexList ?count?? valueList");
        }
        if (convert == false) {
          throw new TclException(
              interp, "-noconvert flag not allowed for the \"setrange\" sub-command");
        }

        TclObject tclValueListObj = argv[argv.length - 1];

        // If an index list is specified, dereference all but the last
        // dimension specified. If the index list is empty, setrange
        // initialized the array object as it would in the java::new
        // command.

        subArrayObj = javaObj;
        subArrayClass = dereferenceClassDims(interp, javaClass, 1);
        index = 0;

        if (numArgs > 1) {
          indexListObj = argv[optionIdx + 1];
          numDims = TclList.getLength(interp, indexListObj);
          if (numDims > 0) {
            subArrayObj = dereferenceArrayDims(interp, javaObj, numDims, indexListObj);
            subArrayClass = dereferenceClassDims(interp, javaClass, numDims);
            index = TclInteger.getInt(interp, TclList.index(interp, indexListObj, numDims - 1));
          }
        }

        // "count" represents the number of elements to set. The
        // default is the minimum of the valueList size and array size
        // less the first index (the remaining elements of the array).
        // If a count is specified and is smaller than the default,
        // the default is overridden.

        count =
            Math.min(
                TclList.getLength(interp, tclValueListObj), Array.getLength(subArrayObj) - index);

        if (numArgs > 2) {
          count = Math.min(count, TclInteger.getInt(interp, argv[optionIdx + 2]));
        }

        // Set the value of "count" elements of the "subArrayObj", starting
        // with the index'th element, to the values in tclValueListObj.

        setArrayElts(interp, subArrayObj, subArrayClass, index, count, tclValueListObj);
        interp.resetResult();
        return;
    }
  }
Exemplo n.º 2
0
 /**
  * Return true if the specified command is complete (ready to be interpreted).
  *
  * @param command The command.
  * @return True if the command is complete.
  */
 public boolean isCommandComplete(String command) {
   return Interp.commandComplete(command);
 }