~35 килобайт сишного кода. нет реализации API курсоров (без них тоже можно, но с ними быстрее шариться по тексту и движок сам будет поддерживать консистентность при изменениях) и нет undo-буфера.
курсоры — это, понятно, элементарно. undo-буфер чуть сложней, но не намного (те же кусочки создавать, только добавлять к ним позицию, откуда сковырнули). все структуры — opaque pointers, все модификации идут через две функции: «вставить» и «удалить». так что undo buffer можно добавить без ломания API вообще.
также поддерживаются «стили». точнее, у каждого куска может быть некое void *udata.
в принципе, вышел универсальный движок для работы с текстовым потоком.
куски, ноды, курсоры и буфера выделяются простым malloc(). это не то, чтобы дико эффективно, но в текущем применении я не рассчитываю редактировать гигабайты текстов, а для сотни-другой килобайт вполне покатит. сделать какой-нибудь zone/pool allocator не проблема, все элементы всё равно создаются фнукцией-конструктором и уничтожаются функцией-деструктором, так что раскиданых по коду malloc()/free() нет.
добью курсоры и undo — выложу на repo.or.cz, наверное. не то, чтобы это ещё кому-нибудь было надо, но лишний бэкап не помешает.
а если немного подпилить (ну, или вообще взять как есть) — вполне можно использовать как замену rope. собственно, это верёвочка и получилась, разве что нет выделеных операций split и concat. может, добавлю потом, операции, в общем-то, тривиальные.