/**
   * Allocate a port according to the explicit/implicit values.
   *
   * @return a new typed port
   */
  private InputPort allocatePort() {
    InputPort ret;

    /*
     * backward compatibility, use explicit as default.
     */
    if (graphics.size() <= GRAPHICS_INIMPL_INDEX) {
      return new ExplicitInputPort(
          controller, controller.createObject(Kind.PORT), Kind.PORT, null, null, null);
    }
    ScilabType inImpl = graphics.get(GRAPHICS_INIMPL_INDEX);

    /*
     * backward compatibility, use explicit as default.
     */
    if (isEmptyField(inImpl)) {
      return new ExplicitInputPort(
          controller, controller.createObject(Kind.PORT), Kind.PORT, null, null, null);
    }

    final ScilabString inImplicit = (ScilabString) inImpl;

    /*
     * backward compatibility, use explicit as default.
     */
    if (isEmptyField(inImplicit)) {
      return new ExplicitInputPort(
          controller, controller.createObject(Kind.PORT), Kind.PORT, null, null, null);
    }

    final boolean isColumnDominant = inImplicit.getHeight() >= inImplicit.getWidth();
    final int[] indexes = getIndexes(alreadyDecodedCount, isColumnDominant);
    final String[][] inimpl = inImplicit.getData();

    // can we safely access the indexed data ?
    final boolean isSet = canGet(inImplicit, indexes);

    /*
     * when the type is set, create a new port instance; create an explicit typed port otherwise.
     */
    if (isSet && inimpl[indexes[0]][indexes[1]].equals(EXPLICIT)) {
      ret =
          new ExplicitInputPort(
              controller, controller.createObject(Kind.PORT), Kind.PORT, null, null, null);
    } else if (isSet && inimpl[indexes[0]][indexes[1]].equals(IMPLICIT)) {
      ret =
          new ImplicitInputPort(
              controller, controller.createObject(Kind.PORT), Kind.PORT, null, null, null);
    } else {
      // when not specified, use explicit
      ret =
          new ExplicitInputPort(
              controller, controller.createObject(Kind.PORT), Kind.PORT, null, null, null);
    }

    return ret;
  }
  /**
   * Fill the port with the parameters from the graphics structure.
   *
   * @param port the target instance
   */
  private void decodeGraphics(InputPort port) {
    // protection against previously stored blocks
    if (graphics.size() > GRAPHICS_INSTYLE_INDEX
        && !isEmptyField(graphics.get(GRAPHICS_INSTYLE_INDEX))) {
      final ScilabString styles = (ScilabString) graphics.get(GRAPHICS_INSTYLE_INDEX);

      boolean isColumnDominant = styles.getHeight() >= styles.getWidth();
      int[] indexes = getIndexes(alreadyDecodedCount, isColumnDominant);

      if (canGet(styles, indexes)) {
        final String style;

        style = styles.getData()[indexes[0]][indexes[1]];
        port.setStyle(new StyleMap(port.getStyle()).putAll(style).toString());
      }
    }

    // protection against previously stored blocks
    if (graphics.size() > GRAPHICS_INLABEL_INDEX
        && !isEmptyField(graphics.get(GRAPHICS_INLABEL_INDEX))) {
      final ScilabString labels = (ScilabString) graphics.get(GRAPHICS_INLABEL_INDEX);

      boolean isColumnDominant = labels.getHeight() >= labels.getWidth();
      int[] indexes = getIndexes(alreadyDecodedCount, isColumnDominant);

      if (canGet(labels, indexes)) {
        final String label = labels.getData()[indexes[0]][indexes[1]];

        if (label != null) {
          port.setValue(label);
        } else {
          port.setValue("");
        }
      }
    }
  }