Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 64 additions & 1 deletion lib/xy.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
* | BingChunMoLi <bingchunmoli@bingchunmoli.com>
* |
* Created On : <2023-08-28>
* Last Modified : <2025-08-27>
* Last Modified : <2025-09-29>
*
*
* xy: 襄阳、咸阳
Expand Down Expand Up @@ -609,6 +609,68 @@ xy_str_strip (const char *str)
return new;
}

typedef struct
{
bool found;
size_t begin;
size_t end;
}
XyStrFindResult_t;

/**
* @brief 查找子串,返回是否命中以及子串在原串中的起止位置(0 基,end 为闭区间)
*/
static XyStrFindResult_t
xy_str_find (const char *str, const char *substr)
{
XyStrFindResult_t result = { .found = false, .begin = 0, .end = 0 };

if (!str || !substr)
return result;

if ('\0' == substr[0])
{
result.found = true;
return result;
}

const char *pos = strstr (str, substr);
if (!pos)
return result;

result.found = true;
result.begin = (size_t) (pos - str);
result.end = result.begin + strlen (substr) - 1;
return result;
}

/**
* @brief 获取字符串下一行的内容
* @note 将忽略开头的换行,截取至下一个换行前(不含换行符)
*/
static char *
xy_str_take_until_newline (const char *str)
{
if (!str)
return xy_strdup ("");

const char *cur = str;
while (*cur == '\n')
cur++;

if ('\0' == *cur)
return xy_strdup ("");

const char *newline = strchr (cur, '\n');
size_t len = newline ? (size_t) (newline - cur) : strlen (cur);

char *ret = xy_malloc0 (len + 1);
strncpy (ret, cur, len);
ret[len] = '\0';
return ret;
}



/**
* @brief 读取文件内容并返回字符串,失败时返回空字符串
Expand Down Expand Up @@ -1617,4 +1679,5 @@ xy_map_each (
}
}


#endif