diff --git a/SabreTools.Library/DatFiles/ClrMamePro.cs b/SabreTools.Library/DatFiles/ClrMamePro.cs
index 143ddbd4..c7417f5b 100644
--- a/SabreTools.Library/DatFiles/ClrMamePro.cs
+++ b/SabreTools.Library/DatFiles/ClrMamePro.cs
@@ -898,8 +898,7 @@ namespace SabreTools.Library.DatFiles
string state = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
switch (rom.Type)
{
diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs
index 55ed55a0..2f96ba2b 100644
--- a/SabreTools.Library/DatFiles/DatFile.cs
+++ b/SabreTools.Library/DatFiles/DatFile.cs
@@ -587,6 +587,90 @@ namespace SabreTools.Library.DatFiles
_datHeader.Postfix = value;
}
}
+ public string AddExtension
+ {
+ get
+ {
+ if (_datHeader == null)
+ {
+ _datHeader = new DatHeader();
+ }
+
+ return _datHeader.AddExtension;
+ }
+ set
+ {
+ if (_datHeader == null)
+ {
+ _datHeader = new DatHeader();
+ }
+
+ _datHeader.AddExtension = value;
+ }
+ }
+ public string ReplaceExtension
+ {
+ get
+ {
+ if (_datHeader == null)
+ {
+ _datHeader = new DatHeader();
+ }
+
+ return _datHeader.ReplaceExtension;
+ }
+ set
+ {
+ if (_datHeader == null)
+ {
+ _datHeader = new DatHeader();
+ }
+
+ _datHeader.ReplaceExtension = value;
+ }
+ }
+ public bool RemoveExtension
+ {
+ get
+ {
+ if (_datHeader == null)
+ {
+ _datHeader = new DatHeader();
+ }
+
+ return _datHeader.RemoveExtension;
+ }
+ set
+ {
+ if (_datHeader == null)
+ {
+ _datHeader = new DatHeader();
+ }
+
+ _datHeader.RemoveExtension = value;
+ }
+ }
+ public bool Romba
+ {
+ get
+ {
+ if (_datHeader == null)
+ {
+ _datHeader = new DatHeader();
+ }
+
+ return _datHeader.Romba;
+ }
+ set
+ {
+ if (_datHeader == null)
+ {
+ _datHeader = new DatHeader();
+ }
+
+ _datHeader.Romba = value;
+ }
+ }
public bool GameName
{
get
@@ -652,90 +736,6 @@ namespace SabreTools.Library.DatFiles
_datHeader.UseRomName = value;
}
}
- public string ReplaceExtension
- {
- get
- {
- if (_datHeader == null)
- {
- _datHeader = new DatHeader();
- }
-
- return _datHeader.ReplaceExtension;
- }
- set
- {
- if (_datHeader == null)
- {
- _datHeader = new DatHeader();
- }
-
- _datHeader.ReplaceExtension = value;
- }
- }
- public string AddExtension
- {
- get
- {
- if (_datHeader == null)
- {
- _datHeader = new DatHeader();
- }
-
- return _datHeader.AddExtension;
- }
- set
- {
- if (_datHeader == null)
- {
- _datHeader = new DatHeader();
- }
-
- _datHeader.AddExtension = value;
- }
- }
- public bool RemoveExtension
- {
- get
- {
- if (_datHeader == null)
- {
- _datHeader = new DatHeader();
- }
-
- return _datHeader.RemoveExtension;
- }
- set
- {
- if (_datHeader == null)
- {
- _datHeader = new DatHeader();
- }
-
- _datHeader.RemoveExtension = value;
- }
- }
- public bool Romba
- {
- get
- {
- if (_datHeader == null)
- {
- _datHeader = new DatHeader();
- }
-
- return _datHeader.Romba;
- }
- set
- {
- if (_datHeader == null)
- {
- _datHeader = new DatHeader();
- }
-
- _datHeader.Romba = value;
- }
- }
// Statistical data related to the DAT
public StatReportFormat ReportFormat
@@ -5896,6 +5896,100 @@ namespace SabreTools.Library.DatFiles
return outfile;
}
+ ///
+ /// Process an item and correctly set the item name
+ ///
+ /// DatItem to update
+ /// True if the Quotes flag should be ignored, false otherwise
+ /// True if the UseRomName should be always on (default), false otherwise
+ protected void ProcessItemName(DatItem item, bool removeQuotes, bool alwaysRomName = true)
+ {
+ string name = item.Name;
+
+ // Backup relevant values and set new ones accordingly
+ bool quotesBackup = Quotes;
+ bool useRomNameBackup = UseRomName;
+ if (removeQuotes)
+ {
+ Quotes = false;
+ }
+ if (alwaysRomName)
+ {
+ UseRomName = true;
+ }
+
+ // Create the proper Prefix and Postfix
+ string pre = CreatePrefixPostfix(item, true);
+ string post = CreatePrefixPostfix(item, false);
+
+ // If we're in Romba mode, take care of that instead
+ if (Romba)
+ {
+ if (item.Type == ItemType.Rom)
+ {
+ // We can only write out if there's a SHA-1
+ if (!String.IsNullOrWhiteSpace(((Rom)item).SHA1))
+ {
+ name = ((Rom)item).SHA1.Substring(0, 2)
+ + "/" + ((Rom)item).SHA1.Substring(2, 2)
+ + "/" + ((Rom)item).SHA1.Substring(4, 2)
+ + "/" + ((Rom)item).SHA1.Substring(6, 2)
+ + "/" + ((Rom)item).SHA1 + ".gz";
+ item.Name = pre + name + post;
+ }
+ }
+ else if (item.Type == ItemType.Disk)
+ {
+ // We can only write out if there's a SHA-1
+ if (!String.IsNullOrWhiteSpace(((Disk)item).SHA1))
+ {
+ name = ((Disk)item).SHA1.Substring(0, 2)
+ + "/" + ((Disk)item).SHA1.Substring(2, 2)
+ + "/" + ((Disk)item).SHA1.Substring(4, 2)
+ + "/" + ((Disk)item).SHA1.Substring(6, 2)
+ + "/" + ((Disk)item).SHA1 + ".gz";
+ item.Name = pre + name + post;
+ }
+ }
+
+ return;
+ }
+
+ if (!String.IsNullOrWhiteSpace(ReplaceExtension) || RemoveExtension)
+ {
+ if (RemoveExtension)
+ {
+ ReplaceExtension = "";
+ }
+
+ string dir = Path.GetDirectoryName(name);
+ dir = (dir.StartsWith(Path.DirectorySeparatorChar.ToString()) ? dir.Remove(0, 1) : dir);
+ name = Path.Combine(dir, Path.GetFileNameWithoutExtension(name) + ReplaceExtension);
+ }
+ if (!String.IsNullOrWhiteSpace(AddExtension))
+ {
+ name += AddExtension;
+ }
+
+ if (UseRomName && GameName)
+ {
+ name = Path.Combine(item.MachineName, name);
+ }
+
+ // Now assign back the item name
+ item.Name = pre + name + post;
+
+ // Restore all relevant values
+ if (removeQuotes)
+ {
+ Quotes = quotesBackup;
+ }
+ if (alwaysRomName)
+ {
+ UseRomName = useRomNameBackup;
+ }
+ }
+
///
/// Create a prefix or postfix from inputs
///
diff --git a/SabreTools.Library/DatFiles/DosCenter.cs b/SabreTools.Library/DatFiles/DosCenter.cs
index 953908fc..cb1a63a9 100644
--- a/SabreTools.Library/DatFiles/DosCenter.cs
+++ b/SabreTools.Library/DatFiles/DosCenter.cs
@@ -271,8 +271,7 @@ namespace SabreTools.Library.DatFiles
string state = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
switch (rom.Type)
{
diff --git a/SabreTools.Library/DatFiles/Hashfile.cs b/SabreTools.Library/DatFiles/Hashfile.cs
index 563b2262..cc9a8bd6 100644
--- a/SabreTools.Library/DatFiles/Hashfile.cs
+++ b/SabreTools.Library/DatFiles/Hashfile.cs
@@ -201,8 +201,7 @@ namespace SabreTools.Library.DatFiles
string state = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
switch (_hash)
{
diff --git a/SabreTools.Library/DatFiles/Listrom.cs b/SabreTools.Library/DatFiles/Listrom.cs
index 939fff45..417576c8 100644
--- a/SabreTools.Library/DatFiles/Listrom.cs
+++ b/SabreTools.Library/DatFiles/Listrom.cs
@@ -410,8 +410,7 @@ namespace SabreTools.Library.DatFiles
string state = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
switch (rom.Type)
{
diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs
index a2129271..26354f91 100644
--- a/SabreTools.Library/DatFiles/Listxml.cs
+++ b/SabreTools.Library/DatFiles/Listxml.cs
@@ -783,8 +783,7 @@ namespace SabreTools.Library.DatFiles
string state = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
switch (rom.Type)
{
diff --git a/SabreTools.Library/DatFiles/Logiqx.cs b/SabreTools.Library/DatFiles/Logiqx.cs
index d175d7b1..e097b31e 100644
--- a/SabreTools.Library/DatFiles/Logiqx.cs
+++ b/SabreTools.Library/DatFiles/Logiqx.cs
@@ -892,8 +892,7 @@ namespace SabreTools.Library.DatFiles
string state = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
switch (rom.Type)
{
diff --git a/SabreTools.Library/DatFiles/Missfile.cs b/SabreTools.Library/DatFiles/Missfile.cs
index c9765f00..cdf3b35d 100644
--- a/SabreTools.Library/DatFiles/Missfile.cs
+++ b/SabreTools.Library/DatFiles/Missfile.cs
@@ -154,74 +154,27 @@ namespace SabreTools.Library.DatFiles
try
{
- string state = "", name = "", pre = "", post = "";
+ string state = "";
- pre = CreatePrefixPostfix(rom, true);
- post = CreatePrefixPostfix(rom, false);
+ // Process the item name
+ ProcessItemName(rom, false, alwaysRomName: false);
// If we're in Romba mode, the state is consistent
if (Romba)
{
- if (rom.Type == ItemType.Rom)
- {
- // We can only write out if there's a SHA-1
- if (!String.IsNullOrWhiteSpace(((Rom)rom).SHA1))
- {
- name = ((Rom)rom).SHA1.Substring(0, 2)
- + "/" + ((Rom)rom).SHA1.Substring(2, 2)
- + "/" + ((Rom)rom).SHA1.Substring(4, 2)
- + "/" + ((Rom)rom).SHA1.Substring(6, 2)
- + "/" + ((Rom)rom).SHA1 + ".gz";
- state += pre + name + post + "\n";
- }
- }
- else if (rom.Type == ItemType.Disk)
- {
- // We can only write out if there's a SHA-1
- if (!String.IsNullOrWhiteSpace(((Disk)rom).SHA1))
- {
- name = ((Disk)rom).SHA1.Substring(0, 2)
- + "/" + ((Disk)rom).SHA1.Substring(2, 2)
- + "/" + ((Disk)rom).SHA1.Substring(4, 2)
- + "/" + ((Disk)rom).SHA1.Substring(6, 2)
- + "/" + ((Disk)rom).SHA1 + ".gz";
- state += pre + name + post + "\n";
- }
- }
+ state += rom.Name + "\n";
}
-
// Otherwise, use any flags
else
{
- name = (UseRomName ? rom.Name : rom.MachineName);
- if (!String.IsNullOrWhiteSpace(ReplaceExtension) || RemoveExtension)
- {
- if (RemoveExtension)
- {
- ReplaceExtension = "";
- }
-
- string dir = Path.GetDirectoryName(name);
- dir = (dir.StartsWith(Path.DirectorySeparatorChar.ToString()) ? dir.Remove(0, 1) : dir);
- name = Path.Combine(dir, Path.GetFileNameWithoutExtension(name) + ReplaceExtension);
- }
- if (!String.IsNullOrWhiteSpace(AddExtension))
- {
- name += AddExtension;
- }
- if (UseRomName && GameName)
- {
- name = Path.Combine(rom.MachineName, name);
- }
-
if (!UseRomName && rom.MachineName != lastgame)
{
- state += pre + name + post + "\n";
+ state += rom.Name + "\n";
lastgame = rom.MachineName;
}
else if (UseRomName)
{
- state += pre + name + post + "\n";
+ state += rom.Name + "\n";
}
}
diff --git a/SabreTools.Library/DatFiles/OfflineList.cs b/SabreTools.Library/DatFiles/OfflineList.cs
index d4809724..e9cf880d 100644
--- a/SabreTools.Library/DatFiles/OfflineList.cs
+++ b/SabreTools.Library/DatFiles/OfflineList.cs
@@ -956,8 +956,7 @@ namespace SabreTools.Library.DatFiles
string state = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
state += "\t\t\n"
+ "\t\t\t1\n"
diff --git a/SabreTools.Library/DatFiles/RomCenter.cs b/SabreTools.Library/DatFiles/RomCenter.cs
index 23acc1bd..55f8c561 100644
--- a/SabreTools.Library/DatFiles/RomCenter.cs
+++ b/SabreTools.Library/DatFiles/RomCenter.cs
@@ -341,8 +341,7 @@ namespace SabreTools.Library.DatFiles
string state = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
if (rom.Type == ItemType.Rom)
{
diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs
index 463c55ed..d9d64a32 100644
--- a/SabreTools.Library/DatFiles/SabreDat.cs
+++ b/SabreTools.Library/DatFiles/SabreDat.cs
@@ -831,8 +831,7 @@ namespace SabreTools.Library.DatFiles
string state = "", prefix = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
for (int i = 0; i < depth; i++)
{
diff --git a/SabreTools.Library/DatFiles/SeparatedValue.cs b/SabreTools.Library/DatFiles/SeparatedValue.cs
index 76e050df..9e999697 100644
--- a/SabreTools.Library/DatFiles/SeparatedValue.cs
+++ b/SabreTools.Library/DatFiles/SeparatedValue.cs
@@ -450,7 +450,21 @@ namespace SabreTools.Library.DatFiles
try
{
- string state = "", pre = "", post = "";
+ // Initialize all strings
+ string state = "",
+ pre = "",
+ post = "",
+ type = "",
+ romname = "",
+ diskname = "",
+ size = "",
+ crc = "",
+ md5 = "",
+ sha1 = "",
+ sha256 = "",
+ sha384 = "",
+ sha512 = "",
+ status = "";
// Separated values should only output Rom and Disk
if (rom.Type != ItemType.Disk && rom.Type != ItemType.Rom)
@@ -458,50 +472,51 @@ namespace SabreTools.Library.DatFiles
return true;
}
- pre = CreatePrefixPostfix(rom, true);
- post = CreatePrefixPostfix(rom, false);
-
if (rom.Type == ItemType.Rom)
{
- string inline = string.Format("\"" + FileName + "\""
- + "{0}\"" + Name + "\""
- + "{0}\"" + Description + "\""
- + "{0}\"" + rom.MachineName + "\""
- + "{0}\"" + rom.MachineDescription + "\""
- + "{0}" + "\"rom\""
- + "{0}\"" + rom.Name + "\""
- + "{0}" + "\"\""
- + "{0}\"" + ((Rom)rom).Size + "\""
- + "{0}\"" + ((Rom)rom).CRC + "\""
- + "{0}\"" + ((Rom)rom).MD5 + "\""
- + "{0}\"" + ((Rom)rom).SHA1 + "\""
- + "{0}\"" + ((Rom)rom).SHA256 + "\""
- // + "{0}\"" + ((Rom)rom).SHA384 + "\""
- // + "{0}\"" + ((Rom)rom).SHA512 + "\""
- + "{0}" + (((Rom)rom).ItemStatus != ItemStatus.None ? "\"" + ((Rom)rom).ItemStatus.ToString() + "\"" : "\"\""), _delim);
- state += pre + inline + post + "\n";
+ type = "rom";
+ romname = rom.Name;
+ size = ((Rom)rom).Size.ToString();
+ crc = ((Rom)rom).CRC;
+ md5 = ((Rom)rom).MD5;
+ sha1 = ((Rom)rom).SHA1;
+ sha256 = ((Rom)rom).SHA256;
+ sha384 = ((Rom)rom).SHA384;
+ sha512 = ((Rom)rom).SHA512;
+ status = (((Rom)rom).ItemStatus != ItemStatus.None ? "\"" + ((Rom)rom).ItemStatus.ToString() + "\"" : "\"\"");
}
else if (rom.Type == ItemType.Disk)
{
- string inline = string.Format("\"" + FileName + "\""
- + "{0}\"" + Name + "\""
- + "{0}\"" + Description + "\""
- + "{0}\"" + rom.MachineName + "\""
- + "{0}\"" + rom.MachineDescription + "\""
- + "{0}" + "\"disk\""
- + "{0}" + "\"\""
- + "{0}\"" + rom.Name + "\""
- + "{0}" + "\"\""
- + "{0}" + "\"\""
- + "{0}\"" + ((Disk)rom).MD5 + "\""
- + "{0}\"" + ((Disk)rom).SHA1 + "\""
- + "{0}\"" + ((Disk)rom).SHA256 + "\""
- // + "{0}\"" + ((Rom)rom).SHA384 + "\""
- // + "{0}\"" + ((Rom)rom).SHA512 + "\""
- + "{0}" + (((Disk)rom).ItemStatus != ItemStatus.None ? "\"" + ((Disk)rom).ItemStatus.ToString() + "\"" : "\"\""), _delim);
- state += pre + inline + post + "\n";
+ type = "disk";
+ diskname = rom.Name;
+ md5 = ((Disk)rom).MD5;
+ sha1 = ((Disk)rom).SHA1;
+ sha256 = ((Disk)rom).SHA256;
+ sha384 = ((Disk)rom).SHA384;
+ sha512 = ((Disk)rom).SHA512;
+ status = (((Disk)rom).ItemStatus != ItemStatus.None ? "\"" + ((Disk)rom).ItemStatus.ToString() + "\"" : "\"\"");
}
+ pre = CreatePrefixPostfix(rom, true);
+ post = CreatePrefixPostfix(rom, false);
+ string inline = string.Format("\"" + FileName + "\""
+ + "{0}\"" + Name + "\""
+ + "{0}\"" + Description + "\""
+ + "{0}\"" + rom.MachineName + "\""
+ + "{0}\"" + rom.MachineDescription + "\""
+ + "{0}\"" + type + "\""
+ + "{0}\"" + romname + "\""
+ + "{0}\"" + diskname + "\""
+ + "{0}\"" + size + "\""
+ + "{0}\"" + crc + "\""
+ + "{0}\"" + md5 + "\""
+ + "{0}\"" + sha1 + "\""
+ + "{0}\"" + sha256 + "\""
+ // + "{0}\"" + sha384 + "\""
+ // + "{0}\"" + sha512 + "\""
+ + "{0}" + status, _delim);
+ state += pre + inline + post + "\n";
+
sw.Write(state);
sw.Flush();
}
diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs
index 22b4b349..9c251879 100644
--- a/SabreTools.Library/DatFiles/SoftwareList.cs
+++ b/SabreTools.Library/DatFiles/SoftwareList.cs
@@ -787,8 +787,7 @@ namespace SabreTools.Library.DatFiles
string state = "";
// Pre-process the item name
- rom.Name = CreatePrefixPostfix(rom, true) + (GameName ? Path.Combine(rom.MachineName, rom.Name) : rom.Name) + CreatePrefixPostfix(rom, false);
- rom.Name = rom.Name.Replace("\"", ""); // Quotes are not needed here
+ ProcessItemName(rom, true);
state += "\t\t\n";
diff --git a/SabreTools.Library/README.1ST b/SabreTools.Library/README.1ST
index 9a3833b3..645a787f 100644
--- a/SabreTools.Library/README.1ST
+++ b/SabreTools.Library/README.1ST
@@ -742,10 +742,9 @@ Options:
-rep, --replace-extension Replace all extensions with specified
When an extension exists, replace it with the provided instead.
- [Missfile only]
-rme, --remove-extensions Remove all extensions from all items
- For each item, remove the extension. [Missfile only]
+ For each item, remove the extension.
-ro, --romba Treat like a Romba depot (requires SHA-1)
This flag allows reading and writing of DATs and output files to
diff --git a/SabreTools/SabreTools.Help.cs b/SabreTools/SabreTools.Help.cs
index 9e19785a..456f3454 100644
--- a/SabreTools/SabreTools.Help.cs
+++ b/SabreTools/SabreTools.Help.cs
@@ -858,7 +858,7 @@ namespace SabreTools
new List() { "-rme", "--remove-extensions" },
"Remove all extensions from all items",
FeatureType.Flag,
- longDescription: "For each item, remove the extension. [Missfile only]");
+ longDescription: "For each item, remove the extension.");
}
}
private static Feature removeMd5Flag
@@ -1877,7 +1877,7 @@ Possible values are: None, Good, BadDump, Nodump, Verified");
new List() { "-ae", "--add-extension" },
"Add an extension to each item",
FeatureType.String,
- longDescription: "Add a postfix extension to each full item name. [Missfile only]");
+ longDescription: "Add a postfix extension to each full item name.");
}
}
private static Feature authorStringInput
@@ -2147,7 +2147,7 @@ Some special strings that can be used:
new List() { "-rep", "--replace-extension" },
"Replace all extensions with specified",
FeatureType.String,
- longDescription: "When an extension exists, replace it with the provided instead. [Missfile only]");
+ longDescription: "When an extension exists, replace it with the provided instead.");
}
}
private static Feature rootStringInput