123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- // =========================================================================================================
- //
- // String Functions Library
- // Version: 2.2.1
- // Author: Kronzky
- //
- // =========================================================================================================
- //
- // Usage:
- //
- // • KRON_StrToArray - Converts a string into an array of characters:
- // _array=[_str] call KRON_StrToArray
- //
- // • KRON_StrLen - Returns the length of the string
- // _len=[_str] call KRON_StrLen
- //
- // • KRON_StrLeft - Returns l characters from the left side of the string
- // _left=[_str,l] call KRON_StrLeft
- //
- // • KRON_StrRight - Returns l characters from the right side of the string
- // _right=[_str,l] call KRON_StrRight
- //
- // • KRON_StrMid - Returns l characters from the string, starting at position p (zero-based)
- // If l is not defined, the rest of the string is returned
- // _mid=[_str,p,(l)] call KRON_StrMid
- //
- // • KRON_StrInStr - Tests whether string b is present in string a
- // _found=[a,b] call KRON_StrInStr
- //
- // • KRON_StrIndex - Returns the position of string b in string a
- // _index=[a,b] call KRON_StrIndex
- //
- // • KRON_StrUpper - Converts a string to uppercase characters
- // _upper=[_str] call KRON_StrUpper
- //
- // • KRON_StrLower - Converts a string to lowercase characters
- // _lower=[_str] call KRON_StrLower
- //
- // • KRON_Replace - Replaces every occurrence of string _old in string _str with string _new
- // _index=[_str,_old,_new] call KRON_Replace
- //
- // • KRON_FindFlag - Checks a mixed array (_this) for the presence of a string (_str)
- // _flg=[_this,_str] call KRON_FindFlag
- //
- // • KRON_getArg - Searches a mixed array (_this) for a matching string beginning with (_t), and returns the part after a separator (s)
- // A default value can be defined as (_d).
- // _arg=[_this,_t,(_d)] call KRON_getArg
- //
- // • KRON_getArgRev - Works like getArg, but search for the part *after* the colon, and return the part in front of it
- // A default value can be defined as (_d).
- // _arg=[_this,_t,(_d)] call KRON_getArgRev
- //
- // • KRON_Compare - Compares two elements and returns -1 if first is smaller, 1 if second is smaller, and 0 if equal
- // If optional parameter "case" is given, capitalization is considered (upper before lowercase)
- // _cmp=[_str1,_str2,("case")] call KRON_Compare
- //
- // • KRON_ArraySort - Sorts an array of strings in acsending order (Numbers before letters, uppercase before lowercase)
- // If array is multi-dimensional, optional parameter (_idx) specifies which column is used for sorting
- // If optional parameter "desc" is given, order is reversed
- // If optional parameter "case" is given, capitalization is considered (upper before lowercase)
- // _srt=[_arr,(_idx),("desc"),("case")] call KRON_ArraySort
- //
- // =========================================================================================================
- KRON_StrToArray = {
- private["_in","_i","_arr","_out"];
- _in=_this select 0;
- _arr = toArray(_in);
- _out=[];
- for "_i" from 0 to (count _arr)-1 do {
- _out=_out+[toString([_arr select _i])];
- };
- _out
- };
- KRON_StrLeft = {
- private["_in","_len","_arr","_out"];
- _in=_this select 0;
- _len=(_this select 1)-1;
- _arr=[_in] call KRON_StrToArray;
- _out="";
- if (_len>=(count _arr)) then {
- _out=_in;
- } else {
- for "_i" from 0 to _len do {
- _out=_out + (_arr select _i);
- };
- };
- _out
- };
- KRON_StrLen = {
- private["_in","_arr","_len"];
- _in=_this select 0;
- _arr=[_in] call KRON_StrToArray;
- _len=count (_arr);
- _len
- };
- KRON_StrRight = {
- private["_in","_len","_arr","_i","_out"];
- _in=_this select 0;
- _len=_this select 1;
- _arr=[_in] call KRON_StrToArray;
- _out="";
- if (_len>(count _arr)) then {_len=count _arr};
- for "_i" from ((count _arr)-_len) to ((count _arr)-1) do {
- _out=_out + (_arr select _i);
- };
- _out
- };
-
- KRON_StrMid = {
- private["_in","_pos","_len","_arr","_i","_out"];
- _in=_this select 0;
- _pos=abs(_this select 1);
- _arr=[_in] call KRON_StrToArray;
- _len=count(_arr);
- if ((count _this)>2) then {_len=(_this select 2)};
- _out="";
- if ((_pos+_len)>=(count _arr)) then {_len=(count _arr)-_pos};
- if (_len>0) then {
- for "_i" from _pos to (_pos+_len-1) do {
- _out=_out + (_arr select _i);
- };
- };
- _out
- };
- KRON_StrIndex = {
- private["_hay","_ndl","_lh","_ln","_arr","_tmp","_i","_j","_out"];
- _hay=_this select 0;
- _ndl=_this select 1;
- _out=-1;
- _i=0;
- if (_hay == _ndl) exitWith {0};
- _lh=[_hay] call KRON_StrLen;
- _ln=[_ndl] call KRON_StrLen;
- if (_lh < _ln) exitWith {-1};
- _arr=[_hay] call KRON_StrToArray;
- for "_i" from 0 to (_lh-_ln) do {
- _tmp="";
- for "_j" from _i to (_i+_ln-1) do {
- _tmp=_tmp + (_arr select _j);
- };
- if (_tmp==_ndl) exitWith {_out=_i};
- };
- _out
- };
- KRON_StrInStr = {
- private["_out"];
- _in=_this select 0;
- _out=if (([_this select 0,_this select 1] call KRON_StrIndex)==-1) then {false} else {true};
- _out
- };
- KRON_Replace = {
- private["_str","_old","_new","_out","_tmp","_jm","_la","_lo","_ln","_i"];
- _str=_this select 0;
- _arr=toArray(_str);
- _la=count _arr;
- _old=_this select 1;
- _new=_this select 2;
- _na=[_new] call KRON_StrToArray;
- _lo=[_old] call KRON_StrLen;
- _ln=[_new] call KRON_StrLen;
- _out="";
- for "_i" from 0 to (count _arr)-1 do {
- _tmp="";
- if (_i <= _la-_lo) then {
- for "_j" from _i to (_i+_lo-1) do {
- _tmp=_tmp + toString([_arr select _j]);
- };
- };
- if (_tmp==_old) then {
- _out=_out+_new;
- _i=_i+_lo-1;
- } else {
- _out=_out+toString([_arr select _i]);
- };
- };
- _out
- };
- KRON_StrUpper = {
- private["_in","_out"];
- _in=_this select 0;
- _out=toUpper(_in);
- _out
- };
- KRON_StrLower = {
- private["_in","_out"];
- _in=_this select 0;
- _out=toLower(_in);
- _out
- };
- KRON_ArrayToUpper = {
- private["_in","_i","_e","_out"];
- _in=_this select 0;
- _out=[];
- if ((count _in)>0) then {
- for "_i" from 0 to (count _in)-1 do {
- _e=_in select _i;
- if (typeName _e=="STRING") then {
- _e=toUpper(_e);
- };
- _out set [_i,_e];
- };
- };
- _out
- };
- KRON_Compare = {
- private["_k","_n","_s","_i","_c","_t","_s1","_s2","_l1","_l2","_l"];
- _k=[_this,"CASE"] call KRON_findFlag;
- _n=0;
- _s=0;
- for "_i" from 0 to 1 do {
- _t=_this select _i;
- switch (typeName _t) do {
- case "SCALAR": {_n=1};
- case "BOOL": {_this set [_i,str(_t)]};
- case "SIDE": {_this set [_i,str(_t)]};
- case "STRING": {if !(_k) then {_this=[_this] call KRON_ArrayToUpper}};
- default {_n=-1};
- };
- };
- _s1 = _this select 0;
- _s2 = _this select 1;
- if (_n!=0) exitWith {
- if (_n==1) then {
- if (_s1<_s2) then {_s=-1} else {if (_s1>_s2) then {_s=1}};
- };
- _s
- };
- _s1 = toArray(_s1);
- _s2 = toArray(_s2);
- _l1 = count _s1;
- _l2 = count _s2;
- _l=if (_l1<_l2) then {_l1} else {_l2};
- for "_i" from 0 to _l-1 do {
- if ((_s1 select _i)<(_s2 select _i)) then {
- _s=-1;
- _i=_l;
- } else {
- if ((_s1 select _i)>(_s2 select _i)) then {
- _s=1;
- _i=_l;
- };
- };
- };
- if (_s==0) then {
- if (_l1<_l2) then {
- _s=-1;
- } else {
- if (_l1>_l2) then {_s=1};
- };
- };
- _s
- };
- KRON_ArraySort = {
- private["_a","_d","_k","_s","_i","_vo","_v1","_v2","_j","_c","_x"];
- _a = +(_this select 0);
- _d = if ([_this,"DESC"] call KRON_findFlag) then {-1} else {1};
- _k = if ([_this,"CASE"] call KRON_findFlag) then {"CASE"} else {"nocase"};
- _s = -1;
- if (typeName (_a select 0)=="ARRAY") then {
- _s=0;
- if (((count _this)>1) && (typeName (_this select 1)=="SCALAR")) then {
- _s=_this select 1;
- };
- };
- for "_i" from 0 to (count _a)-1 do {
- _vo = _a select _i;
- _v1 = _vo;
- if (_s>-1) then {_v1=_v1 select _s};
- _j = 0;
- for [{_j=_i-1},{_j>=0},{_j=_j-1}] do {
- _v2 = _a select _j;
- if (_s>-1) then {_v2=_v2 select _s};
- _c=[_v2,_v1,_k] call KRON_Compare;
- if (_c!=_d) exitWith {};
- _a set [_j+1,_a select _j];
- };
- _a set [_j+1,_vo];
- };
- _a
- };
- KRON_findFlag = {
- private["_in","_flg","_arr","_out"];
- _in=_this select 0;
- _flg=toUpper(_this select 1);
- _arr=[_in] call KRON_ArrayToUpper;
- _out=_flg in _arr;
- _out
- };
- KRON_getArg = {
- private["_in","_flg","_fl","_def","_arr","_i","_j","_as","_aa","_org","_p","_out"];
- _in=_this select 0;
- _flg=toUpper(_this select 1);
- _fl=[_flg] call KRON_StrLen;
- _out="";
- if ((count _this)>2) then {_out=_this select 2};
- _arr=[_in] call KRON_ArrayToUpper;
- if ((count _arr)>0) then {
- for "_i" from 0 to (count _in)-1 do {
- _as = _arr select _i;
- if (typeName _as=="STRING") then {
- _aa = [_as] call KRON_StrToArray;
- _p = _aa find ":";
- if (_p==_fl) then {
- if (([_as,_fl] call KRON_StrLeft)==_flg) then {
- _org = _in select _i;
- _out=[_org,_p+1] call KRON_StrMid;
- };
- };
- };
- };
- };
- _out
- };
- KRON_getArgRev = {
- private["_in","_flg","_fl","_def","_arr","_i","_j","_as","_aa","_org","_p","_out"];
- _in=_this select 0;
- _flg=toUpper(_this select 1);
- _fl=[_flg] call KRON_StrLen;
- _out="";
- if ((count _this)>2) then {_out=_this select 2};
- _arr=[_in] call KRON_ArrayToUpper;
- if ((count _arr)>0) then {
- for "_i" from 0 to (count _in)-1 do {
- _as = _arr select _i;
- if (typeName _as=="STRING") then {
- _aa = [_as] call KRON_StrToArray;
- _p = _aa find ":";
- if (_p+1==(count _aa)-_fl) then {
- if (([_as,_p+1] call KRON_StrMid)==_flg) then {
- _org = _in select _i;
- _out=[_org,_p] call KRON_StrLeft;
- };
- };
- };
- };
- };
- _out
- };
|