classdef editCode % Класс для редактирования кода C/C++ в текстовых файлах % Обеспечивает извлечение и вставку кода в секции и функции methods(Static) function newCode = insertSection(code, sectionName, newText) % Вставка или замена содержимого секции или тела функции % % Аргументы: % code - исходный текст кода как строка % sectionName - имя секции (например, 'MY_SECTION') или % заголовок функции (например, 'void myFunc(...)') % newText - новый текст для вставки внутрь секции или функции % % Возвращает: % newCode - обновлённый текст с подставленным содержимым % % Особенности: % - Если sectionName начинается с 'void ', считается что это функция, % и вставка происходит внутрь её тела % - Для секций ищется блок между маркерами "NAME START" и "NAME END" % - Поддерживает функции с параметрами и вложенными скобками newCode = code; % Обработка функций (если sectionName начинается с 'void ') if startsWith(strtrim(sectionName), 'void ') % Извлекаем имя функции из заголовка tokens = regexp(sectionName, 'void\s+(\w+)\s*\(', 'tokens'); if isempty(tokens) return; % Не удалось извлечь имя функции end funcName = tokens{1}{1}; % Ищем начало функции в коде expr = sprintf('void\\s+%s\\s*\\(.*?\\)\\s*\\{', funcName); startIdx = regexp(code, expr, 'start'); if isempty(startIdx) return; % Функция не найдена end % Находим тело функции с учётом вложенных фигурных скобок from = startIdx(1); braceCount = 0; % Счётчик уровня вложенности скобок i = from; while i <= length(code) if code(i) == '{' braceCount = braceCount + 1; if braceCount == 1 bodyStart = i + 1; % Начало тела функции (после {) end elseif code(i) == '}' braceCount = braceCount - 1; if braceCount == 0 bodyEnd = i - 1; % Конец тела функции (перед }) break; end end i = i + 1; end % Проверяем что все скобки закрыты if braceCount ~= 0 return; % Несбалансированные скобки end % Собираем новый код: начало до тела + новый текст + конец после тела newCode = [ ... code(1:bodyStart-1), ... newline, newText, newline, ... code(bodyEnd+1:end) ... ]; return; end % Обработка обычных секций (не функций) % Формируем шаблон для поиска секции: начало, содержимое, конец pattern = sprintf('(%s START\\s*\\n)(.*?)(\\s*%s END)', sectionName, sectionName); % Проверяем наличие секции в коде startIdx = regexp(code, pattern, 'start', 'once'); if isempty(startIdx) error('Секция "%s" не найдена в тексте.', sectionName); end % Формируем новую секцию с переданным текстом replacement = sprintf('%s START\n%s\n%s END', sectionName, newText, sectionName); % Заменяем всю найденную секцию на новую newCode = regexprep(code, pattern, replacement, 'dotall'); end function result = extractSection(code, sectionName) % Извлечение содержимого секции или тела функции % % Аргументы: % code - исходный текст кода как строка % sectionName - имя секции (например, 'MY_SECTION') или % заголовок функции (например, 'void myFunc(...)') % % Возвращает: % result - извлечённый текст из секции или тела функции % % Особенности: % - Для функций извлекает содержимое между { и } с учётом вложенности % - Для секций извлекает текст между маркерами START и END % - Сохращает оригинальные отступы и форматирование result = ''; % Обработка функций (если sectionName начинается с 'void ') if startsWith(strtrim(sectionName), 'void ') % Извлекаем имя функции из заголовка tokens = regexp(sectionName, 'void\s+(\w+)\s*\(', 'tokens'); if isempty(tokens) return; % Не удалось извлечь имя функции end funcName = tokens{1}{1}; % Ищем начало функции в коде expr = sprintf('void\\s+%s\\s*\\(.*?\\)\\s*\\{', funcName); startIdx = regexp(code, expr, 'start'); if isempty(startIdx) return; % Функция не найдена end % Находим тело функции с учётом вложенных фигурных скобок from = startIdx(1); braceCount = 0; % Счётчик уровня вложенности скобок i = from; while i <= length(code) if code(i) == '{' braceCount = braceCount + 1; if braceCount == 1 braceOpenIdx = i; % Позиция открывающей скобки end elseif code(i) == '}' braceCount = braceCount - 1; if braceCount == 0 braceCloseIdx = i; % Позиция закрывающей скобки break; end end i = i + 1; end % Проверяем что все скобки закрыты if braceCount ~= 0 return; % Несбалансированные скобки end % Находим первую новую строку после открывающей скобки { newlineAfterOpen = regexp(code(braceOpenIdx:end), '\n', 'once'); if isempty(newlineAfterOpen) return; % Не найден перевод строки end bodyStart = braceOpenIdx + newlineAfterOpen; % Начало тела функции % Находим последнюю новую строку перед закрывающей скобкой } newlinesBeforeClose = regexp(code(1:braceCloseIdx), '\n'); if isempty(newlinesBeforeClose) return; % Не найдены переводы строк end bodyEnd = newlinesBeforeClose(end) - 1; % Конец тела функции % Извлекаем тело функции с сохранением форматирования result = code(bodyStart:bodyEnd); return; end % Обработка обычных секций (не функций) % Ищем секцию между маркерами START и END pattern = sprintf('%s START\\s*\\n(.*?)\n%s END', sectionName, sectionName); % Извлекаем содержимое секции match = regexp(code, pattern, 'tokens', 'dotall'); if ~isempty(match) result = match{1}{1}; % Возвращаем содержимое секции else % Секция не найдена - выводим сообщение об ошибке mcuMask.disp(0, 'Ошибка: cекция "%s" не найдена в тексте.', sectionName); end end end end