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); }
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; }