ЛР3. Указатели, массивы, строки, массивы строк

Задание 1 (20)

Общий вид функции main позволяет получить доступ к параметрам командной строки и переменным окружения:
int main(int argc, char **argv, char **env)
Разработать утилиту, которая будет выводить на экран содержимое переменных окружения (параметр env), имена которых переданы в командной строке (параметры argc и argv):
  1. При отсутствии параметров в командной строке утилита должна выводить правила своего использования.
  2. Поиск переменных окружения должен быть регистронезависимым.
  3. Каждая переменная выводится в двух строках: имя и значение. Затем - строка разделитель вида "---"
  4. При отсутствии в окружении искомой переменной, утилита должна выводить пустую строку вместо значения переменной
Список переменных окружения можно получить в терминале утилитой env.

Задание 2 (35)

Разработать утилиту управления квадратной матрицей целочисленной matrix. Запуск утилиты:
matrix [опция]

В отсутствие опции утилита принимает матрицу со стандартного ввода и отправляет на стандартный вывод. Форма ввода матрицы - набор целых чисел через пробел. Матрица квадратная, поэтому количество строк ввода определяется количеством чисел в первой строке, лишние строки игнорируются, обработка ошибок ввода не предусматривается. Форма вывода матрицы - набор целых чисел через пробел. Количество строк вывода определяется количеством чисел в первой строке.

Список опций:

-c N - создает матрицу NxN, заполняет нулями и выводит на стандартный поток вывода.
-r A B - принимает матрицу со стандартного вывода, заменяет все элементы случайными значениями
    в диапазоне [A,B] и выводит полученную матрицу на стандартный вывод.
-e X Y Z - принимает матрицу со стандартного вывода, заменяет элемент по координатам (X,Y)
    значением Z и выводит полученную матрицу на стандартный вывод.
-R  - принимает матрицу со стандартного вывода, поворачивает ее на 90 градусов по часовой стрелке
    и выводит полученную матрицу на стандартный вывод.
-L  - принимает матрицу со стандартного вывода, поворачивает ее на 90 градусов против часовой стрелки
    и выводит полученную матрицу на стандартный вывод.

Каждая опция, должна быть реализована в виде функции с передачей матрицы параметром вида int **m, размера матрицы и необходимых дополнительных параметров. Ввод и вывод матрицы должны быть реализованы отдельными функциями.
Например:
КомандаВводВывод
./matrix -e 0 1 333 1 2 3
11 12 13
111 112 113
1111 1112 1113
1 2 3
333 12 13
111 112 113

Задание 3 (25+20)

Разработать утилиту, которая принимает на стандартный ввод две матрицы одинакового размера и выводит строку, представляющую собой конвеейр, формирующий последовательность минимально возможного количества вызовов утилиты matrix, приводящий первую матрицу ко второй.
Например:
ВводВывод
1 2
3 4
3 1
4 3
./matrix -R | ./matrix -e 1 1 3