Skip to content

Commit

Permalink
Implemented more 'String*'-methods (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
Unknown6656 committed Jul 14, 2020
1 parent cbb42d3 commit d48c0b6
Show file tree
Hide file tree
Showing 4 changed files with 215 additions and 93 deletions.
12 changes: 6 additions & 6 deletions new/AutoItInterpreter/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@

//////////////////////////////////////////////////////////////////////////
// Autogenerated 2020-07-13 15:26:52.055 //
// Autogenerated 2020-07-14 10:51:02.600 //
// ANY CHANGES TO THIS DOCUMENT WILL BE LOST UPON RE-GENERATION //
//////////////////////////////////////////////////////////////////////////

using System.Reflection;
using System;

[assembly: AssemblyVersion("0.5.1055.20195")]
[assembly: AssemblyFileVersion("0.5.1055.20195")]
[assembly: AssemblyInformationalVersion("b577bfd8fb4d7256e4ed61801285a044356294bb")]
[assembly: AssemblyVersion("0.5.1059.20196")]
[assembly: AssemblyFileVersion("0.5.1059.20196")]
[assembly: AssemblyInformationalVersion("cbb42d325d8e7499e919fd7154738b8e13fc96d8")]
[assembly: AssemblyCompany("Unknown6656")]
[assembly: AssemblyCopyright("Copyright © 2018 - 2020, Unknown6656")]
[assembly: AssemblyProduct("AutoIt3 Interpreter by Unknown6656")]
Expand All @@ -20,6 +20,6 @@ public static class __module__
public static string Author { get; } = "Unknown6656";
public static string Year { get; } = "2018 - 2020";
public static string Copyright { get; } = "Copyright © 2018 - 2020, Unknown6656";
public static Version? InterpreterVersion { get; } = Version.Parse("0.5.1055.20195");
public static string GitHash { get; } = "b577bfd8fb4d7256e4ed61801285a044356294bb";
public static Version? InterpreterVersion { get; } = Version.Parse("0.5.1059.20196");
public static string GitHash { get; } = "cbb42d325d8e7499e919fd7154738b8e13fc96d8";
}
245 changes: 207 additions & 38 deletions new/AutoItInterpreter/Extensibility/Plugins.Au3Framework.Functions.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
Expand All @@ -10,8 +11,6 @@
using Unknown6656.AutoIt3.COM;
using Unknown6656.Common;
using Unknown6656.IO;
using System.Text.RegularExpressions;
using System.Reflection.Metadata.Ecma335;

namespace Unknown6656.AutoIt3.Extensibility.Plugins.Au3Framework
{
Expand Down Expand Up @@ -133,16 +132,16 @@ public sealed class FrameworkFunctions
ProvidedNativeFunction.Create(nameof(StringAddCR), 1, StringAddCR),
ProvidedNativeFunction.Create(nameof(StringCompare), 2, 3, StringCompare, Variant.Zero),
ProvidedNativeFunction.Create(nameof(StringFormat), 1, 33, StringFormat),
// ProvidedNativeFunction.Create(nameof(StringFromASCIIArray), , StringFromASCIIArray),
// ProvidedNativeFunction.Create(nameof(StringInStr), , StringInStr),
ProvidedNativeFunction.Create(nameof(StringFromASCIIArray), 1, 4, StringFromASCIIArray, Variant.Zero, -1, Variant.Zero),
ProvidedNativeFunction.Create(nameof(StringInStr), 2, 6, StringInStr, Variant.Zero, 1, 1, Variant.Default),
ProvidedNativeFunction.Create(nameof(StringLeft), 2, StringLeft),
ProvidedNativeFunction.Create(nameof(StringLen), 1, StringLen),
ProvidedNativeFunction.Create(nameof(StringLower), 1, StringLower),
ProvidedNativeFunction.Create(nameof(StringMid), 2, 3, StringMid, -1),
// ProvidedNativeFunction.Create(nameof(StringRegExp), , StringRegExp),
// ProvidedNativeFunction.Create(nameof(StringRegExpReplace ), , StringRegExpReplace ),
// ProvidedNativeFunction.Create(nameof(StringReplace), , StringReplace),
// ProvidedNativeFunction.Create(nameof(StringReverse), , StringReverse),
ProvidedNativeFunction.Create(nameof(StringRegExp), 2, 4, StringRegExp, Variant.Zero, 1),
ProvidedNativeFunction.Create(nameof(StringRegExpReplace ), 3, 4, StringRegExpReplace, Variant.Zero),
ProvidedNativeFunction.Create(nameof(StringReplace), 3, 5, StringReplace, Variant.Zero, Variant.Zero),
ProvidedNativeFunction.Create(nameof(StringReverse), 1, 2, StringReverse, Variant.Zero),
ProvidedNativeFunction.Create(nameof(StringRight), 2, StringRight),
// ProvidedNativeFunction.Create(nameof(StringSplit), , StringSplit),
ProvidedNativeFunction.Create(nameof(StringStripCR), 1, StringStripCR),
Expand Down Expand Up @@ -188,7 +187,6 @@ private static Union<InterpreterError, AU3CallFrame> GetAu3Caller(CallFrame? fra
return InterpreterError.WellKnown(null, "error.au3_caller_only", funcname);
}


public static FunctionReturnValue AutoItWinGetTitle(CallFrame frame, Variant[] args) => (Variant)Console.Title;

public static FunctionReturnValue AutoItWinSetTitle(CallFrame frame, Variant[] args)
Expand Down Expand Up @@ -1506,15 +1504,80 @@ public static FunctionReturnValue ObjName(CallFrame frame, Variant[] args)

public static FunctionReturnValue StringFormat(CallFrame frame, Variant[] args) => (Variant)StringFormatter.FormatString(args[0].ToString(), args[1..]);

// public static FunctionReturnValue StringFromASCIIArray(CallFrame frame, Variant[] args)
// {
//
// }
//
// public static FunctionReturnValue StringInStr(CallFrame frame, Variant[] args)
// {
//
// }
public static FunctionReturnValue StringFromASCIIArray(CallFrame frame, Variant[] args)
{
if (args[0].Type is not VariantType.Array)
return FunctionReturnValue.Error(1, 0, Variant.EmptyString);

try
{
Variant[] data = args[0].ToArray();
int start = (int)args[1];
int end = (int)args[2];
int enc = (int)args[3];

if (end < 0)
end = int.MaxValue;

IEnumerable<char>? chars = data[start..Math.Min(end, data.Length)].Select(v => unchecked((char)(int)v));

return Variant.FromString(enc switch
{
2 => Encoding.UTF8.GetString(chars.ToArray(c => (byte)c)),
1 => new string(chars.ToArray(c => (char)(byte)c)),
_ => new string(chars.ToArray()),
});
}
catch
{
return FunctionReturnValue.Error(2, 0, Variant.EmptyString);
}
}

public static FunctionReturnValue StringInStr(CallFrame frame, Variant[] args)
{
string input = args[0].ToString();
string substr = args[1].ToString();
StringComparison mode = ((int)args[2]) switch
{
1 => StringComparison.InvariantCulture,
2 => StringComparison.InvariantCultureIgnoreCase,
_ => StringComparison.CurrentCultureIgnoreCase,
};
int occurence = (int)args[3];
int start = (int)args[4] - 1;
int count = (int)args[5];

if (count < 0)
count = int.MaxValue;

if (start >= 0 && start < input.Length)
try
{
count = Math.Min(count, input.Length - start);

int sindex = start + (occurence < 0 ? count : 0);

while (occurence != 0)
{
int match = occurence < 0 ? input.LastIndexOf(substr, sindex, count - sindex + start, mode) : input.IndexOf(substr, sindex, count - sindex + start, mode);

if (match < 0)
break;
else if ((occurence += occurence < 0 ? 1 : -1) == 0)
return Variant.FromNumber(match + 1);
else
sindex = match;
}

return Variant.Zero;
}
catch
{
}

return FunctionReturnValue.Error(1);
}

public static FunctionReturnValue StringLeft(CallFrame frame, Variant[] args)
{
Expand Down Expand Up @@ -1542,25 +1605,131 @@ public static FunctionReturnValue StringMid(CallFrame frame, Variant[] args)
return (Variant)(len < 0 ? "" : str.Substring(start, len));
}

// public static FunctionReturnValue StringRegExp(CallFrame frame, Variant[] args)
// {
//
// }
//
// public static FunctionReturnValue StringRegExpReplace(CallFrame frame, Variant[] args)
// {
//
// }
//
// public static FunctionReturnValue StringReplace(CallFrame frame, Variant[] args)
// {
//
// }
//
// public static FunctionReturnValue StringReverse(CallFrame frame, Variant[] args)
// {
//
// }
public static FunctionReturnValue StringRegExp(CallFrame frame, Variant[] args)
{
Regex regex;
string input = args[0].ToString();
int flag = (int)args[2];
int offset = (int)args[3];

try
{
regex = new Regex(args[1].ToString());
}
catch
{
return FunctionReturnValue.Error(2, 0);
}

Variant to_array(Match match)
{
Variant[] groups = match.Groups.Cast<Group>().ToArray(g => (Variant)g.Value);

if (flag is 1 or 3 && groups.Length > 1)
groups = groups[1..];

return Variant.FromArray(groups);
}

if (flag is 1 or 2)
{
if (input.Match(regex, out Match m))
return to_array(m);
else
return FunctionReturnValue.Error(1);
}
else if (flag is 3 or 4)
{
Variant result = Variant.FromArray(regex.Matches(input).Select(to_array));

if (result.Length > 0)
return result;
else
return FunctionReturnValue.Error(1);
}
else
return (Variant)regex.IsMatch(input);
}

public static FunctionReturnValue StringRegExpReplace(CallFrame frame, Variant[] args)
{
Regex regex;
string input = args[0].ToString();
string replacement = args[2].ToString();
int count = (int)args[3];
bool all = count == 0;
int i = 0;

try
{
regex = new Regex(args[1].ToString());
}
catch
{
return FunctionReturnValue.Error(2, 0);
}

while (i < count || all)
if (input.Match(regex, out Match m))
{
input = input[..m.Index] + replacement + input[(m.Index + m.Length)..];
++i;
}
else
break;

if (i == 0)
return FunctionReturnValue.Error(input, 1, i);
else
return FunctionReturnValue.Success(input, i);
}

public static FunctionReturnValue StringReplace(CallFrame frame, Variant[] args)
{
string input = args[0].ToString();
string search = args[1].ToString();
string replace = args[2].ToString();
int occurence = (int)args[3];
StringComparison mode = ((int)args[4]) switch
{
1 => StringComparison.InvariantCulture,
2 => StringComparison.InvariantCultureIgnoreCase,
_ => StringComparison.CurrentCultureIgnoreCase,
};
int count = 0;
int sindex = 0;

if (occurence == 0)
occurence = int.MaxValue;
else if (occurence < 0)
sindex = input.Length;

while (occurence != 0)
{
int index = occurence > 0 ? input.IndexOf(search, sindex, mode) : input.LastIndexOf(search, sindex, mode);

if (index == -1)
break;

if (occurence < 0)
{
++occurence;
sindex = index;
}
else
{
--occurence;
sindex = index + replace.Length;
}

input = input[..index] + replace + input[(index + search.Length)..];
++count;
}

return FunctionReturnValue.Success(input, count);
}

public static FunctionReturnValue StringReverse(CallFrame frame, Variant[] args) => (Variant)new string(args[0].ToString().Reverse().ToArray());

public static FunctionReturnValue StringRight(CallFrame frame, Variant[] args)
{
Expand Down
4 changes: 2 additions & 2 deletions new/AutoItInterpreter/version.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
0.5.1055.20195
b577bfd8fb4d7256e4ed61801285a044356294bb
0.5.1059.20196
cbb42d325d8e7499e919fd7154738b8e13fc96d8
47 changes: 0 additions & 47 deletions new/test/test.au3
Original file line number Diff line number Diff line change
@@ -1,51 +1,4 @@
Example()

Func Example()
Local $iInt_Unsigned = 43951789
Local $iInt_Negative = -43951789

ConsoleWrite(@CRLF & "Numeric Formats" & @CRLF)

PrintFormat($iInt_Unsigned, "%d", "standard positive integer with no sign", 1) ; 43951789
PrintFormat($iInt_Negative, "%d", "standard negative integer with sign", 1) ; -43951789
PrintFormat($iInt_Unsigned, "%i", "standard integer", 1) ; 43951789
PrintFormat($iInt_Unsigned, "%09i", "9 digits with leading zero", 1) ; 043951789
PrintFormat($iInt_Unsigned, "%e", "scientific notation") ; 4.395179e+007
PrintFormat($iInt_Unsigned, "%u", "unsigned integer with positive integer", 1) ; 43951789
PrintFormat($iInt_Negative, "%u", "unsigned integer with negative integer", 1) ; 4251015507
PrintFormat($iInt_Unsigned, "%f", "floating point") ; 43951789.000000
PrintFormat($iInt_Unsigned, "%.2f", "floating point with 2 digits after decimal point", 1) ; 43951789.00
PrintFormat($iInt_Unsigned, "%o", "octal", 1) ; 247523255
PrintFormat($iInt_Unsigned, "%s", "string", 1) ; 43951789
PrintFormat($iInt_Unsigned, "%x", "hexadecimal (lower-case)", 1) ; 29ea6ad
PrintFormat($iInt_Unsigned, "%X", "hexadecimal (upper-case)", 1) ; 29EA6AD
PrintFormat($iInt_Unsigned, "%+d", "sign specifier on a positive integer", 1) ; +43951789
PrintFormat($iInt_Negative, "%+d", "sign specifier on a negative integer", 1) ; -43951789

Local $sString = "string"
Local $sString_Long = "longstring"

ConsoleWrite(@CRLF & "String Formats - [ ] used to show beginning/end of string" & @CRLF)

PrintFormat($sString, "[%s]", "standard string", 1) ; [string]
PrintFormat($sString, "[%10s]", "10 chars right justified with added spaces") ; [ string]
PrintFormat($sString, "[%-10s]", "10 chars left justified with added spaces") ; [string ]
PrintFormat($sString_Long, "[%10.8s]", "right justified but precision 8 so truncated") ; [ longer s]
PrintFormat($sString_Long, "[%-10.8s]", "left justifed but precision 8 so truncated") ; [longer s ]
PrintFormat($sString, "[%010s]", "10 chars with leading zero") ; [0000string]

ConsoleWrite(@CRLF & "Date Format - each % uses a new parameter" & @CRLF)
ConsoleWrite('"%02i\%02i\%04i" 0n (1, 9, 2013) => ' & StringFormat("%02i\%02i\%04i", 1, 9, 2013) & @CRLF)

ConsoleWrite(@CRLF & "Just string to format without Vars" & @CRLF)
ConsoleWrite('"Some \texample text\n" => ' & StringFormat('Some \texample text\n'))
EndFunc ;==>Example

Func PrintFormat($vVar, $sFormat, $sExplan, $iTab = 0)
ConsoleWrite('"' & $sFormat & '" on ' & $vVar & @TAB & ' => ' & StringFormat($sFormat, $vVar))
If $iTab Then ConsoleWrite(@TAB)
ConsoleWrite(@TAB & " ; " & $sExplan & @CRLF)
EndFunc
exit
$xl = ObjCreate("Excel.Application")

Expand Down

0 comments on commit d48c0b6

Please sign in to comment.