#include <zephyr/kernel.h>
#include <string.h>
#include <stdio.h>
/**
* @brief Находит текст между маркером и концом строки.
*
* @param src Исходная строка для поиска.
* @param start_str Маркер, после которого нужно забрать текст.
* @param out_buf Буфер для сохранения результата.
* @param out_size Размер выходного буфера.
* @return 0 при успехе, -1 если маркер не найден.
*/
int get_text_until_newline(const char *src, const char *start_str,
char *out_buf, size_size out_size) {
// 1. Ищем начало вхождения маркера
char *start_ptr = strstr(src, start_str);
if (!start_ptr) {
return -1; // Маркер не найден
}
// 2. Смещаемся на длину самого маркера
start_ptr += strlen(start_str);
// 3. Ищем перевод строки (\n) или конец строки (\0)
char *end_ptr = strchr(start_ptr, '\n');
// Определяем длину извлекаемого текста
size_t len = end_ptr ? (size_t)(end_ptr - start_ptr) : strlen(start_ptr);
// Убираем \r, если он есть перед \n (для Windows-style окончаний)
if (len > 0 && start_ptr[len - 1] == '\r') {
len--;
}
// 4. Копируем результат в буфер с учетом размера
if (len >= out_size) {
len = out_size - 1;
}
strncpy(out_buf, start_ptr, len);
out_buf[len] = '\0'; // Обязательно закрываем строку
return 0;
}
int main(void) {
const char *data = "Status: OK\r\nVersion: 1.2.3\nPayload: data";
char result[32];
if (get_text_until_newline(data, "Version: ", result, sizeof(result)) == 0) {
printk("Found text: [%s]\n", result); // Выведет:
} else {
printk("Marker not found\n");
}
return 0;
}