> не передергивайте.Ну давайте расскажу, как _я_ воспринимаю этот код.
30 секунд просмотра функции, и я понимаю следующее: f обозначает filename, i - instance, ret - возвращаемое значение. Имена a и b ничего не обозначают (но по коду далее видно, что они хранят длины соответственно первой и второй незаменяемых частей юнита).
Сам я systemd не пользовался, поэтому не знал, для чего нужна @ в именах юнитов. Добавим сюда ещё 5 минут гугления, какой формат имеет имя юнита, и чтения (точнее, чтения первого абзаца, содержащего символ @) http://man7.org/linux/man-pages/man5/systemd.unit.5.html (тот, кто правит код systemd имхо должен знать ту часть, что необходима для понимания данного фрагмента).
Теперь также ясно, что e - extension, p - либо part (заменяемая часть, типа tty3 с ведущим символом @), либо pointer, s - просто string, так же как циклах принято делать итерацию по i (от integer).
Из имени функции я предполагаю, что она должна заменять инстанс юнита f (на который указывает p+1) инстансом i.
"s = new" - выделение памяти.
А пример со вложенным вызовом mempcpy взят из man mempcpy и может считаться стандартным.
Возможно, я не прав и сказывается собственный сишный опыт, но для меня понять, что делает конкретно озвученная ранее строка, не проблема. При этом мне не надо постоянно переходить по разным методам, как это принято в java и c++ , у меня вся функция помещается на одном экране. И лично для меня идентификаторы p и e выглядят более "различными визуально", чем, например, "unit_name_part и unit_name_ext".
Я бы сказал, что это пример каноничного C, где идентификаторы сокращаются насколько это возможно (но не меньше), по этой же причине при итерации вы пишете "for (i=0; i<10; i++)", а не "for(index=0; index<10; index++)".