mend0za: (karate)
mend0za ([personal profile] mend0za) wrote2010-10-25 10:07 pm

Хреновые будни прикладника

Под бодрящие звуки Steppennwolf с воодушевлением, обострённым близким дедлайном, ломаю первую, вылизанную и оттестированную версию своего кустарного кодогенератора.

В настоящий момент дикий мужчина делает полиморфизм и reflection на Plain C + AWK + С Preprocessor.

Да содрогнется любой заказчик от недо-функциональщика на бреющем полёте метапрограммирования.
Cрезающего сосны под корень. Потом верхний слой почвы. Следом гранит. Но в итоге выходящий на около-земную орбиту.

BORN TO BE WIILD! Пусть сдохнут все кто нас не любит.


Гнусные подробности



Есть пространство переменных, имеющих имя и ID, могущих быть 5-ти типов (битовое поле, uint8, uint16, uint32, string и массивы из перечисленных). Их писать и читать. IPMI Config Variables, если кому-то что-то говорит.

Пространство переменных определено в ортодоксальном текстовом CSV-файле. Переменные физически могут быть дьявол знает где. Большая часть - 16KB двоичная область на NVRAM EEPROM, в упакованном двоичном формате. Остальное размазано по системе как джем по бутерброду пенсионера. Legacy формат, окаменевшее дерьмо бронтозавра , нечестивой своей киркой не трожь.

В CSV файле есть директивы препроцессора (ifdef, комментарии), дающие рудиментарное управление конфигурациями. Я заманчиво пообещал заказчику возможность редактировать раскладку переменных из Excel, но пока соскакиваю с темы. Пусть правят CSV руками.

По CSV скриптом на AWK генерятся развесистые данные, описывающие весь этот переменный бред в понятиях мест хранения и представления.

Библиотека на выходе даёт простейшее API вида set_variable_value(), get_variable_value(). И ей начхать на размер хранимых данных, место хранения, организацию и порядок.

А ещё наверху FUSE бантиком (опциональным). Чтобы показать красоту и благолепие. И была ночь, и был день шестой, и закачик сказал "это хорошо!". До того у него ехала крыша от устного и графического материала, сопровождавшего разработку, намечалась истерика от словосочетания "кодогенерация".

Наблюдательный персонаж скажет "ASN.1"! И будет почти теоретически прав. Самопальный, предметно ориентированный, ASN.1 PEP-подобный чугунный самокат с квадратными колёсами из массива ольхи.

Промышленное чугунное литьё самоката сопровождалось починянием примуса в NVRAM EEPROM драйвере. Авторы нашего Linux BSP как на подбор - резиновые изделия N2 размера XXXL. Гондоны и лицензия-суходрочеры, кто не понял.




Особо гнусные подробности



Эмуляция ООП на структурах и указателях функций. Самодельное RTTI. Кустарный Reflection (пригодился в FUSE).

Насладитесь тестовой обвязкой, эмулирующей анально-ориентированный мир MTD в Linux.


EEPROM_IMAGE=eeprom.backup

ifeq ($(ARCH),i686)
$(MTD):
cp $(EEPROM_IMAGE) /tmp/$(EEPROM_IMAGE)
-sudo losetup $(LOOP_DEVICE) /tmp/$(EEPROM_IMAGE)
-sudo modprobe block2mtd block2mtd=$(LOOP_DEVICE)
endif

test: $(BINARY_TEST) $(MTD)
@rm -f *.gcda
./$(BINARY_TEST) $(MTD)

clean:
rm -fv $(OBJ) $(OBJ_TEST) $(DATA_FILE) $(BINARY) $(BINARY_TEST) *.gcda *.gcno core
ifeq ($(ARCH),i686)
-sudo rmmod block2mtd
-for i in /dev/loop*; do sudo losetup -d $$i; done
-rm -fv /tmp/$(EEPROM_IMAGE)
endif


Особенно хороши unit-тесты на Check + --coverage. Покрытие кода тестами предыдущей версии близко к 100%. В ggcov смотреть обожаю, радует глаз.



Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
No Subject Icon Selected
More info about formatting