summaryrefslogtreecommitdiffstats
path: root/DTFormatN.c
diff options
context:
space:
mode:
Diffstat (limited to 'DTFormatN.c')
-rw-r--r--DTFormatN.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/DTFormatN.c b/DTFormatN.c
new file mode 100644
index 0000000..0f9481b
--- /dev/null
+++ b/DTFormatN.c
@@ -0,0 +1,87 @@
+#strict 2
+
+global func FormatN(string format, array placeholders, array items)
+{
+ if(!items && GetType(placeholders[0]) == C4V_Array)
+ {
+ items = CreateArray(GetLength(placeholders));
+ for(var i = 0; i < GetLength(placeholders); ++i)
+ {
+ items[i] = placeholders[i][1];
+ placeholders[i] = placeholders[i][0];
+ }
+ }
+
+ var ret = "";
+
+ var inPlaceholder = 0;
+ var placeholderType = "";
+ var placeholderPart = "";
+
+ for(var i = 0; i < GetLength(format); ++i)
+ {
+ var c = GetChar(format, i);
+ if(c == 37) // %
+ {
+ if(inPlaceholder == 0)
+ {
+ inPlaceholder = 1;
+ }
+ else if(inPlaceholder == 1)
+ {
+ if(c == 37 && GetLength(placeholderType) == 0) // %
+ {
+ ret = Format("%s%%", ret);
+ inPlaceholder = 0;
+ }
+ else
+ {
+ inPlaceholder = 2;
+ }
+ }
+ else if(inPlaceholder == 2)
+ {
+ var index = GetIndexOf2(placeholderPart, placeholders);
+ if(index == -1)
+ {
+ FatalError(Format("FormatN: Unkown placeholder \"%s\"", placeholderPart));
+ return 0;
+ }
+
+ ret = Format(Format("%%s%%%s", placeholderType), ret, items[index]);
+
+ inPlaceholder = 0;
+ placeholderType = "";
+ placeholderPart = "";
+ }
+ }
+ else
+ {
+ if(inPlaceholder == 0)
+ {
+ ret = Format("%s%c", ret, c);
+ }
+ else if(inPlaceholder == 1)
+ {
+ placeholderType = Format("%s%c", placeholderType, c);
+ }
+ else if(inPlaceholder == 2)
+ {
+ placeholderPart = Format("%s%c", placeholderPart, c);
+ }
+ }
+ }
+
+ if(inPlaceholder == 1)
+ {
+ FatalError(Format("FormatN: Placeholder not finished at end of format-string: \"%%%s\"", placeholderType));
+ return 0;
+ }
+ else if(inPlaceholder == 2)
+ {
+ FatalError(Format("FormatN: Placeholder not finished at end of format-string: \"%%%s%%%s\"", placeholderType, placeholderPart));
+ return 0;
+ }
+
+ return ret;
+}