summaryrefslogtreecommitdiffstats
path: root/Common/Module/CIPHER/CIPHER_Init.sqf
blob: 05866ba4368681b0ce4e9813baf772a9c039ae8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/* 
 * Cipher Module
 * Author: Benny.
 * Description: Alphabetical functions such as sorting and string compare.
 */

 
/* Compare whether string A is greater than string B */
CIPHER_CompareString = {
	Private ["_aisgreater","_stringA","_stringB"];
	_stringA = toArray(_this select 0);
	_stringB = toArray(_this select 1);
	
	_aisgreater = false;
	
	for '_i' from 0 to count(_stringA)-1 do {
		if (_i > count(_stringB)-1) exitWith {_aisgreater = true};
		if ((_stringA select _i) != (_stringB select _i)) exitWith {
			_aisgreater = if ((_stringA select _i) > (_stringB select _i)) then {true} else {false};
		};
	};
	
	_aisgreater;
};

/* Swap Element A with Element B in an array. */
CIPHER_ArraySwap = {
	Private ["_array","_elea","_eleb","_posa","_posb"];
	_array = _this select 0;
	_posa = _this select 1;
	_posb = _this select 2;
	
	_elea = _array select _posa;
	_eleb = _array select _posb;
	
	_array set [_posa, _eleb];
	_array set [_posb, _elea];
	
	_array;
};

/* Reverse an array */
CIPER_ArrayReverse = {
	Private ["_array","_reversed","_u"];
	_array = _this;
	_reversed = [];
	
	_u = 0;
	for '_i' from count(_array)-1 step -1 to 0 do {
		_reversed set [_u, _array select _i];
		_u = _u + 1;
	};
	
	_reversed
};

/* Sort an array by alphabetical order, selection sort. */
CIPHER_SortArray = {
	Private['_auxArray','_list','_min','_reverse'];

	_list = _this select 0;
	_reverse = _this select 1;
	_auxArray = if (count _this > 2) then {+(_this select 2)} else {[]};
	
	if (count _list == 0) exitWith {[]};
	_isString = if (typeName(_list select 0) == typeName "") then {true} else {false};

	for '_i' from 0 to (count _list)-1 do {		
		_min = _i;
		
		for '_j' from _i+1 to (count _list)-1 do {
			if (_isString) then {
				if !([_list select _j, _list select _min] Call CIPHER_CompareString) then {_min = _j}
			} else {
				if ((_list select _j) < (_list select _min)) then {_min = _j};
			};
		};
		
		if (_min != _i) then {
			_list = [_list, _i, _min] Call CIPHER_ArraySwap;
			if (count _auxArray > 0) then {_auxArray = [_auxArray, _i, _min] Call CIPHER_ArraySwap};
		};
	};
	
	if (_reverse) then {
		_list = (_list) Call CIPER_ArrayReverse;
		if (count _auxArray > 0) then {_auxArray = (_auxArray) Call CIPER_ArrayReverse};
	};
	
	[_list, _auxArray]
};