nutools/lib/nulib/awk/base.array.awk

158 lines
3.8 KiB
Awk

# -*- coding: utf-8 mode: awk -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function mkindices(values, indices, i, j) {
array_new(indices);
j = 1;
for (i in values) {
indices[j++] = int(i);
}
return asort(indices);
}
function array_new(dest) {
dest[0] = 0; # forcer awk à considérer dest comme un tableau
delete dest;
}
function array_newsize(dest, size, i) {
dest[0] = 0; # forcer awk à considérer dest comme un tableau
delete dest;
size = int(size);
for (i = 1; i <= size; i++) {
dest[i] = "";
}
}
function array_len(values, count, i) {
# length(array) a un bug sur awk 3.1.5
# cette version est plus lente mais fonctionne toujours
count = 0;
for (i in values) {
count++;
}
return count;
}
function array_copy(dest, src, count, indices, i) {
array_new(dest);
count = mkindices(src, indices);
for (i = 1; i <= count; i++) {
dest[indices[i]] = src[indices[i]];
}
}
function array_getlastindex(src, count, indices) {
count = mkindices(src, indices);
if (count == 0) return 0;
return indices[count];
}
function array_add(dest, value, lastindex) {
lastindex = array_getlastindex(dest);
dest[lastindex + 1] = value;
}
function array_deli(dest, i, l) {
i = int(i);
if (i == 0) return;
l = array_len(dest);
while (i < l) {
dest[i] = dest[i + 1];
i++;
}
delete dest[l];
}
function array_del(dest, value, ignoreCase, i) {
do {
i = key_index(value, dest, ignoreCase);
if (i != 0) array_deli(dest, i);
} while (i != 0);
}
function array_extend(dest, src, count, lastindex, indices, i) {
lastindex = array_getlastindex(dest);
count = mkindices(src, indices);
for (i = 1; i <= count; i++) {
dest[lastindex + i] = src[indices[i]];
}
}
function array_fill(dest, i) {
array_new(dest);
for (i = 1; i <= NF; i++) {
dest[i] = $i;
}
}
function array_getline(src, count, indices, i, j) {
$0 = "";
count = mkindices(src, indices);
for (i = 1; i <= count; i++) {
j = indices[i];
$j = src[j];
}
}
function array_appendline(src, count, indices, i, nf, j) {
count = mkindices(src, indices);
nf = NF;
for (i = 1; i <= count; i++) {
j = nf + indices[i];
$j = src[indices[i]];
}
}
function in_array(value, values, ignoreCase, i) {
if (ignoreCase) {
value = tolower(value);
for (i in values) {
if (tolower(values[i]) == value) return 1;
}
} else {
for (i in values) {
if (values[i] == value) return 1;
}
}
return 0;
}
function key_index(value, values, ignoreCase, i) {
if (ignoreCase) {
value = tolower(value);
for (i in values) {
if (tolower(values[i]) == value) return int(i);
}
} else {
for (i in values) {
if (values[i] == value) return int(i);
}
}
return 0;
}
function array2s(values, prefix, sep, suffix, noindices, first, i, s) {
if (!prefix) prefix = "[";
if (!sep) sep = ", ";
if (!suffix) suffix = "]";
s = prefix;
first = 1;
for (i in values) {
if (first) first = 0;
else s = s sep;
if (!noindices) s = s "[" i "]=";
s = s values[i];
}
s = s suffix;
return s;
}
function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) {
if (!prefix) prefix = "[";
if (!sep) sep = ", ";
if (!suffix) suffix = "]";
s = prefix;
count = mkindices(values, indices);
for (i = 1; i <= count; i++) {
if (i > 1) s = s sep;
if (!noindices) s = s "[" indices[i] "]=";
s = s values[indices[i]];
}
s = s suffix;
return s;
}
function array_join(values, sep, prefix, suffix, count, indices, i, s) {
s = prefix;
count = mkindices(values, indices);
for (i = 1; i <= count; i++) {
if (i > 1) s = s sep;
s = s values[indices[i]];
}
s = s suffix;
return s;
}