示例#1
0
        public TCL.CompletionCode cmdProc(Interp interp, TclObject[] objv)
        {
            VersionSatisfiesResult vsres;
            Package  pkg;
            PkgAvail avail;
            PkgAvail prev;
            string   version;
            string   pkgName;
            string   key;
            string   cmd;
            string   ver1, ver2;

            System.Text.StringBuilder sbuf;
            IDictionaryEnumerator     enum_Renamed;
            int  i, opt, exact;
            bool once;

            if (objv.Length < 2)
            {
                throw new TclNumArgsException(interp, 1, objv, "option ?arg arg ...?");
            }
            opt = TclIndex.get(interp, objv[1], validCmds, "option", 0);
            switch (opt)
            {
            case OPT_FORGET:  {
                // Forget takes 0 or more arguments.

                for (i = 2; i < objv.Length; i++)
                {
                    // We do not need to check to make sure
                    // package name is "" because it would not
                    // be in the hash table so name will be ignored.


                    pkgName = objv[i].ToString();
                    pkg     = (Package)interp.packageTable[pkgName];

                    // If this package does not exist, go to next one.

                    if (pkg == null)
                    {
                        continue;
                    }
                    SupportClass.HashtableRemove(interp.packageTable, pkgName);
                    while (pkg.avail != null)
                    {
                        avail     = pkg.avail;
                        pkg.avail = avail.next;
                        avail     = null;
                    }
                    pkg = null;
                }
                return(TCL.CompletionCode.RETURN);
            }

            case OPT_IFNEEDED:  {
                if ((objv.Length < 4) || (objv.Length > 5))
                {
                    throw new TclNumArgsException(interp, 1, objv, "ifneeded package version ?script?");
                }
                pkgName = objv[2].ToString();
                version = objv[3].ToString();

                // Verify that this version string is valid.

                checkVersion(interp, version);
                if (objv.Length == 4)
                {
                    pkg = (Package)interp.packageTable[pkgName];
                    if (pkg == null)
                    {
                        return(TCL.CompletionCode.RETURN);
                    }
                }
                else
                {
                    pkg = findPackage(interp, pkgName);
                }
                for (avail = pkg.avail, prev = null; avail != null; prev = avail, avail = avail.next)
                {
                    if (compareVersions(avail.version, version, null) == 0)
                    {
                        if (objv.Length == 4)
                        {
                            // If doing a query return current script.

                            interp.setResult(avail.script);
                            return(TCL.CompletionCode.RETURN);
                        }

                        // We matched so we must be setting the script.

                        break;
                    }
                }

                // When we do not match on a query return nothing.

                if (objv.Length == 4)
                {
                    return(TCL.CompletionCode.RETURN);
                }
                if (avail == null)
                {
                    avail         = new PkgAvail();
                    avail.version = version;
                    if (prev == null)
                    {
                        avail.next = pkg.avail;
                        pkg.avail  = avail;
                    }
                    else
                    {
                        avail.next = prev.next;
                        prev.next  = avail;
                    }
                }

                avail.script = objv[4].ToString();
                return(TCL.CompletionCode.RETURN);
            }

            case OPT_NAMES:  {
                if (objv.Length != 2)
                {
                    throw new TclNumArgsException(interp, 1, objv, "names");
                }

                try
                {
                    sbuf         = new System.Text.StringBuilder();
                    enum_Renamed = interp.packageTable.GetEnumerator();
                    once         = false;
                    while (enum_Renamed.MoveNext())
                    {
                        once = true;
                        key  = ((string)enum_Renamed.Current);
                        pkg  = (Package)enum_Renamed.Value;
                        if (((System.Object)pkg.version != null) || (pkg.avail != null))
                        {
                            Util.appendElement(interp, sbuf, key);
                        }
                    }
                    if (once)
                    {
                        interp.setResult(sbuf.ToString());
                    }
                }
                catch (TclException e)
                {
                    throw new TclRuntimeError("unexpected TclException: " + e);
                }
                return(TCL.CompletionCode.RETURN);
            }

            case OPT_PRESENT:  {
                if (objv.Length < 3)
                {
                    throw new TclNumArgsException(interp, 2, objv, "?-exact? package ?version?");
                }

                if (objv[2].ToString().Equals("-exact"))
                {
                    exact = 1;
                }
                else
                {
                    exact = 0;
                }

                version = null;
                if (objv.Length == (4 + exact))
                {
                    version = objv[3 + exact].ToString();
                    checkVersion(interp, version);
                }
                else if ((objv.Length != 3) || (exact == 1))
                {
                    throw new TclNumArgsException(interp, 2, objv, "?-exact? package ?version?");
                }
                if (exact == 1)
                {
                    version = pkgPresent(interp, objv[3].ToString(), version, true);
                }
                else
                {
                    version = pkgPresent(interp, objv[2].ToString(), version, false);
                }
                interp.setResult(version);
                break;
            }

            case OPT_PROVIDE:  {
                if ((objv.Length < 3) || (objv.Length > 4))
                {
                    throw new TclNumArgsException(interp, 1, objv, "provide package ?version?");
                }
                if (objv.Length == 3)
                {
                    pkg = (Package)interp.packageTable[objv[2].ToString()];
                    if (pkg != null)
                    {
                        if ((System.Object)pkg.version != null)
                        {
                            interp.setResult(pkg.version);
                        }
                    }
                    return(TCL.CompletionCode.RETURN);
                }

                pkgProvide(interp, objv[2].ToString(), objv[3].ToString());
                return(TCL.CompletionCode.RETURN);
            }

            case OPT_REQUIRE:  {
                if ((objv.Length < 3) || (objv.Length > 5))
                {
                    throw new TclNumArgsException(interp, 1, objv, "require ?-exact? package ?version?");
                }

                if (objv[2].ToString().Equals("-exact"))
                {
                    exact = 1;
                }
                else
                {
                    exact = 0;
                }
                version = null;
                if (objv.Length == (4 + exact))
                {
                    version = objv[3 + exact].ToString();
                    checkVersion(interp, version);
                }
                else if ((objv.Length != 3) || (exact == 1))
                {
                    throw new TclNumArgsException(interp, 1, objv, "require ?-exact? package ?version?");
                }
                if (exact == 1)
                {
                    version = pkgRequire(interp, objv[3].ToString(), version, true);
                }
                else
                {
                    version = pkgRequire(interp, objv[2].ToString(), version, false);
                }
                interp.setResult(version);
                return(TCL.CompletionCode.RETURN);
            }

            case OPT_UNKNOWN:  {
                if (objv.Length > 3)
                {
                    throw new TclNumArgsException(interp, 1, objv, "unknown ?command?");
                }
                if (objv.Length == 2)
                {
                    if ((System.Object)interp.packageUnknown != null)
                    {
                        interp.setResult(interp.packageUnknown);
                    }
                }
                else if (objv.Length == 3)
                {
                    interp.packageUnknown = null;

                    cmd = objv[2].ToString();
                    if (cmd.Length > 0)
                    {
                        interp.packageUnknown = cmd;
                    }
                }
                return(TCL.CompletionCode.RETURN);
            }

            case OPT_VCOMPARE:  {
                if (objv.Length != 4)
                {
                    throw new TclNumArgsException(interp, 1, objv, "vcompare version1 version2");
                }

                ver1 = objv[2].ToString();

                ver2 = objv[3].ToString();
                checkVersion(interp, ver1);
                checkVersion(interp, ver2);
                interp.setResult(compareVersions(ver1, ver2, null));
                return(TCL.CompletionCode.RETURN);
            }

            case OPT_VERSIONS:  {
                if (objv.Length != 3)
                {
                    throw new TclNumArgsException(interp, 1, objv, "versions package");
                }

                pkg = (Package)interp.packageTable[objv[2].ToString()];
                if (pkg != null)
                {
                    try
                    {
                        sbuf = new System.Text.StringBuilder();
                        once = false;
                        for (avail = pkg.avail; avail != null; avail = avail.next)
                        {
                            once = true;
                            Util.appendElement(interp, sbuf, avail.version);
                        }
                        if (once)
                        {
                            interp.setResult(sbuf.ToString());
                        }
                    }
                    catch (TclException e)
                    {
                        throw new TclRuntimeError("unexpected TclException: " + e.Message, e);
                    }
                }
                return(TCL.CompletionCode.RETURN);
            }

            case OPT_VSATISFIES:  {
                if (objv.Length != 4)
                {
                    throw new TclNumArgsException(interp, 1, objv, "vsatisfies version1 version2");
                }


                ver1 = objv[2].ToString();

                ver2 = objv[3].ToString();
                checkVersion(interp, ver1);
                checkVersion(interp, ver2);
                vsres = new VersionSatisfiesResult();
                compareVersions(ver1, ver2, vsres);
                interp.setResult(vsres.satisfies);
                return(TCL.CompletionCode.RETURN);
            }

            default:  {
                throw new TclRuntimeError("TclIndex.get() error");
            }
            }             // end switch(opt)
            return(TCL.CompletionCode.RETURN);
        }
示例#2
0
    public TCL.CompletionCode cmdProc( Interp interp, TclObject[] objv )
    {
      VersionSatisfiesResult vsres;
      Package pkg;
      PkgAvail avail;
      PkgAvail prev;
      string version;
      string pkgName;
      string key;
      string cmd;
      string ver1, ver2;
      StringBuilder sbuf;
      IDictionaryEnumerator enum_Renamed;
      int i, opt, exact;
      bool once;

      if ( objv.Length < 2 )
      {
        throw new TclNumArgsException( interp, 1, objv, "option ?arg arg ...?" );
      }
      opt = TclIndex.get( interp, objv[1], validCmds, "option", 0 );
      switch ( opt )
      {

        case OPT_FORGET:
          {
            // Forget takes 0 or more arguments.

            for ( i = 2; i < objv.Length; i++ )
            {
              // We do not need to check to make sure
              // package name is "" because it would not
              // be in the hash table so name will be ignored.


              pkgName = objv[i].ToString();
              pkg = (Package)interp.packageTable[pkgName];

              // If this package does not exist, go to next one.

              if ( pkg == null )
              {
                continue;
              }
              SupportClass.HashtableRemove( interp.packageTable, pkgName );
              while ( pkg.avail != null )
              {
                avail = pkg.avail;
                pkg.avail = avail.next;
                avail = null;
              }
              pkg = null;
            }
            return TCL.CompletionCode.RETURN;
          }

        case OPT_IFNEEDED:
          {
            if ( ( objv.Length < 4 ) || ( objv.Length > 5 ) )
            {
              throw new TclNumArgsException( interp, 1, objv, "ifneeded package version ?script?" );
            }
            pkgName = objv[2].ToString();
            version = objv[3].ToString();

            // Verify that this version string is valid.

            checkVersion( interp, version );
            if ( objv.Length == 4 )
            {
              pkg = (Package)interp.packageTable[pkgName];
              if ( pkg == null )
                return TCL.CompletionCode.RETURN;
            }
            else
            {
              pkg = findPackage( interp, pkgName );
            }
            for ( avail = pkg.avail, prev = null; avail != null; prev = avail, avail = avail.next )
            {
              if ( compareVersions( avail.version, version, null ) == 0 )
              {
                if ( objv.Length == 4 )
                {
                  // If doing a query return current script.

                  interp.setResult( avail.script );
                  return TCL.CompletionCode.RETURN;
                }

                // We matched so we must be setting the script.

                break;
              }
            }

            // When we do not match on a query return nothing.

            if ( objv.Length == 4 )
            {
              return TCL.CompletionCode.RETURN;
            }
            if ( avail == null )
            {
              avail = new PkgAvail();
              avail.version = version;
              if ( prev == null )
              {
                avail.next = pkg.avail;
                pkg.avail = avail;
              }
              else
              {
                avail.next = prev.next;
                prev.next = avail;
              }
            }

            avail.script = objv[4].ToString();
            return TCL.CompletionCode.RETURN;
          }

        case OPT_NAMES:
          {
            if ( objv.Length != 2 )
            {
              throw new TclNumArgsException( interp, 1, objv, "names" );
            }

            try
            {
              sbuf = new StringBuilder();
              enum_Renamed = interp.packageTable.GetEnumerator();
              once = false;
              while ( enum_Renamed.MoveNext() )
              {
                once = true;
                key = ( (string)enum_Renamed.Current );
                pkg = (Package)enum_Renamed.Value;
                if ( ( (System.Object)pkg.version != null ) || ( pkg.avail != null ) )
                {
                  Util.appendElement( interp, sbuf, key );
                }
              }
              if ( once )
              {
                interp.setResult( sbuf.ToString() );
              }
            }
            catch ( TclException e )
            {

              throw new TclRuntimeError( "unexpected TclException: " + e );
            }
            return TCL.CompletionCode.RETURN;
          }

        case OPT_PRESENT:
          {
            if ( objv.Length < 3 )
            {
              throw new TclNumArgsException( interp, 2, objv, "?-exact? package ?version?" );
            }

            if ( objv[2].ToString().Equals( "-exact" ) )
            {
              exact = 1;
            }
            else
            {
              exact = 0;
            }

            version = null;
            if ( objv.Length == ( 4 + exact ) )
            {

              version = objv[3 + exact].ToString();
              checkVersion( interp, version );
            }
            else if ( ( objv.Length != 3 ) || ( exact == 1 ) )
            {
              throw new TclNumArgsException( interp, 2, objv, "?-exact? package ?version?" );
            }
            if ( exact == 1 )
            {

              version = pkgPresent( interp, objv[3].ToString(), version, true );
            }
            else
            {

              version = pkgPresent( interp, objv[2].ToString(), version, false );
            }
            interp.setResult( version );
            break;
          }

        case OPT_PROVIDE:
          {
            if ( ( objv.Length < 3 ) || ( objv.Length > 4 ) )
            {
              throw new TclNumArgsException( interp, 1, objv, "provide package ?version?" );
            }
            if ( objv.Length == 3 )
            {

              pkg = (Package)interp.packageTable[objv[2].ToString()];
              if ( pkg != null )
              {
                if ( (System.Object)pkg.version != null )
                {
                  interp.setResult( pkg.version );
                }
              }
              return TCL.CompletionCode.RETURN;
            }

            pkgProvide( interp, objv[2].ToString(), objv[3].ToString() );
            return TCL.CompletionCode.RETURN;
          }

        case OPT_REQUIRE:
          {
            if ( ( objv.Length < 3 ) || ( objv.Length > 5 ) )
            {
              throw new TclNumArgsException( interp, 1, objv, "require ?-exact? package ?version?" );
            }

            if ( objv[2].ToString().Equals( "-exact" ) )
            {
              exact = 1;
            }
            else
            {
              exact = 0;
            }
            version = null;
            if ( objv.Length == ( 4 + exact ) )
            {

              version = objv[3 + exact].ToString();
              checkVersion( interp, version );
            }
            else if ( ( objv.Length != 3 ) || ( exact == 1 ) )
            {
              throw new TclNumArgsException( interp, 1, objv, "require ?-exact? package ?version?" );
            }
            if ( exact == 1 )
            {

              version = pkgRequire( interp, objv[3].ToString(), version, true );
            }
            else
            {

              version = pkgRequire( interp, objv[2].ToString(), version, false );
            }
            interp.setResult( version );
            return TCL.CompletionCode.RETURN;
          }

        case OPT_UNKNOWN:
          {
            if ( objv.Length > 3 )
            {
              throw new TclNumArgsException( interp, 1, objv, "unknown ?command?" );
            }
            if ( objv.Length == 2 )
            {
              if ( (System.Object)interp.packageUnknown != null )
              {
                interp.setResult( interp.packageUnknown );
              }
            }
            else if ( objv.Length == 3 )
            {
              interp.packageUnknown = null;

              cmd = objv[2].ToString();
              if ( cmd.Length > 0 )
              {
                interp.packageUnknown = cmd;
              }
            }
            return TCL.CompletionCode.RETURN;
          }

        case OPT_VCOMPARE:
          {
            if ( objv.Length != 4 )
            {
              throw new TclNumArgsException( interp, 1, objv, "vcompare version1 version2" );
            }

            ver1 = objv[2].ToString();

            ver2 = objv[3].ToString();
            checkVersion( interp, ver1 );
            checkVersion( interp, ver2 );
            interp.setResult( compareVersions( ver1, ver2, null ) );
            return TCL.CompletionCode.RETURN;
          }

        case OPT_VERSIONS:
          {
            if ( objv.Length != 3 )
            {
              throw new TclNumArgsException( interp, 1, objv, "versions package" );
            }

            pkg = (Package)interp.packageTable[objv[2].ToString()];
            if ( pkg != null )
            {
              try
              {
                sbuf = new StringBuilder();
                once = false;
                for ( avail = pkg.avail; avail != null; avail = avail.next )
                {
                  once = true;
                  Util.appendElement( interp, sbuf, avail.version );
                }
                if ( once )
                {
                  interp.setResult( sbuf.ToString() );
                }
              }
              catch ( TclException e )
              {
                throw new TclRuntimeError( "unexpected TclException: " + e.Message, e );
              }
            }
            return TCL.CompletionCode.RETURN;
          }

        case OPT_VSATISFIES:
          {
            if ( objv.Length != 4 )
            {
              throw new TclNumArgsException( interp, 1, objv, "vsatisfies version1 version2" );
            }


            ver1 = objv[2].ToString();

            ver2 = objv[3].ToString();
            checkVersion( interp, ver1 );
            checkVersion( interp, ver2 );
            vsres = new VersionSatisfiesResult();
            compareVersions( ver1, ver2, vsres );
            interp.setResult( vsres.satisfies );
            return TCL.CompletionCode.RETURN;
          }

        default:
          {
            throw new TclRuntimeError( "TclIndex.get() error" );
          }

      } // end switch(opt)
      return TCL.CompletionCode.RETURN;
    }