| 1 |
/*************************************************************************** |
/* SPDX-License-Identifier: GPL-3.0-or-later */ |
| 2 |
article_cache.c - description |
/* |
| 3 |
------------------- |
* article_cache |
| 4 |
Copyright : (C) 2004-2025 by Leaflet |
* - convert article content from DB to local cache with LML conversion and line offset index |
| 5 |
Email : leaflet@leafok.com |
* |
| 6 |
***************************************************************************/ |
* Copyright (C) 2004-2025 by Leaflet <leaflet@leafok.com> |
| 7 |
|
*/ |
|
/*************************************************************************** |
|
|
* * |
|
|
* This program is free software; you can redistribute it and/or modify * |
|
|
* it under the terms of the GNU General Public License as published by * |
|
|
* the Free Software Foundation; either version 3 of the License, or * |
|
|
* (at your option) any later version. * |
|
|
* * |
|
|
***************************************************************************/ |
|
| 8 |
|
|
| 9 |
#include "article_cache.h" |
#include "article_cache.h" |
| 10 |
#include "lml.h" |
#include "lml.h" |
| 41 |
{ |
{ |
| 42 |
if (file_path == NULL || cache_dir == NULL || p_article == NULL) |
if (file_path == NULL || cache_dir == NULL || p_article == NULL) |
| 43 |
{ |
{ |
| 44 |
log_error("article_cache_path() NULL pointer error\n"); |
log_error("NULL pointer error\n"); |
| 45 |
return -1; |
return -1; |
| 46 |
} |
} |
| 47 |
|
|
| 68 |
|
|
| 69 |
if (cache_dir == NULL || p_article == NULL || content == NULL) |
if (cache_dir == NULL || p_article == NULL || content == NULL) |
| 70 |
{ |
{ |
| 71 |
log_error("article_cache_generate() NULL pointer error\n"); |
log_error("NULL pointer error\n"); |
| 72 |
return -1; |
return -1; |
| 73 |
} |
} |
| 74 |
|
|
| 103 |
|
|
| 104 |
// Generate article header / footer |
// Generate article header / footer |
| 105 |
localtime_r(&(p_article->sub_dt), &tm_sub_dt); |
localtime_r(&(p_article->sub_dt), &tm_sub_dt); |
| 106 |
strftime(str_sub_dt, sizeof(str_sub_dt), "%c", &tm_sub_dt); |
strftime(str_sub_dt, sizeof(str_sub_dt), "%c %Z", &tm_sub_dt); |
| 107 |
|
|
| 108 |
snprintf(header, sizeof(header), "发布者: %s (%s), 版块: %s (%s)\n标 题: %s\n发布于: %s (%s)\n\n", |
snprintf(header, sizeof(header), "发布者: %s (%s), 版块: %s (%s)\n标 题: %s\n发布于: %s (%s)\n\n", |
| 109 |
p_article->username, p_article->nickname, p_section->sname, p_section->stitle, p_article->title, BBS_name, str_sub_dt); |
p_article->username, p_article->nickname, p_section->sname, p_section->stitle, p_article->title, BBS_name, str_sub_dt); |
| 127 |
} |
} |
| 128 |
|
|
| 129 |
// Apply LML render to content body |
// Apply LML render to content body |
| 130 |
cache.data_len = header_len + (size_t)lml_plain(content, content_f, ARTICLE_CONTENT_MAX_LEN, 1); |
cache.data_len = header_len + (size_t)lml_render(content, content_f, ARTICLE_CONTENT_MAX_LEN, SCREEN_COLS, 0); |
| 131 |
|
|
| 132 |
cache.line_total = header_line_cnt + |
cache.line_total = header_line_cnt + |
| 133 |
split_data_lines(content_f, SCREEN_COLS, cache.line_offsets + header_line_cnt, MAX_SPLIT_FILE_LINES - header_line_cnt, 1, NULL); |
split_data_lines(content_f, SCREEN_COLS + 1, cache.line_offsets + header_line_cnt, MAX_SPLIT_FILE_LINES - header_line_cnt, 1, NULL); |
| 134 |
|
|
| 135 |
if (cache.data_len - header_len != (size_t)cache.line_offsets[cache.line_total]) |
if (cache.data_len - header_len != (size_t)cache.line_offsets[cache.line_total]) |
| 136 |
{ |
{ |
| 219 |
|
|
| 220 |
if (p_cache == NULL || cache_dir == NULL || p_article == NULL) |
if (p_cache == NULL || cache_dir == NULL || p_article == NULL) |
| 221 |
{ |
{ |
| 222 |
log_error("article_cache_load() NULL pointer error\n"); |
log_error("NULL pointer error\n"); |
| 223 |
return -1; |
return -1; |
| 224 |
} |
} |
| 225 |
|
|
| 266 |
memcpy((void *)p_cache, p_mmap, (size_t)(((ARTICLE_CACHE *)p_mmap)->mmap_len - ((ARTICLE_CACHE *)p_mmap)->data_len)); |
memcpy((void *)p_cache, p_mmap, (size_t)(((ARTICLE_CACHE *)p_mmap)->mmap_len - ((ARTICLE_CACHE *)p_mmap)->data_len)); |
| 267 |
|
|
| 268 |
p_cache->p_mmap = p_mmap; |
p_cache->p_mmap = p_mmap; |
| 269 |
p_cache->p_data = p_mmap + (p_cache->mmap_len - p_cache->data_len); |
p_cache->p_data = (char *)p_mmap + (p_cache->mmap_len - p_cache->data_len); |
| 270 |
|
|
| 271 |
return 0; |
return 0; |
| 272 |
} |
} |
| 275 |
{ |
{ |
| 276 |
if (p_cache == NULL || p_cache->p_mmap == NULL) |
if (p_cache == NULL || p_cache->p_mmap == NULL) |
| 277 |
{ |
{ |
| 278 |
log_error("article_cache_unload() NULL pointer error\n"); |
log_error("NULL pointer error\n"); |
| 279 |
return -1; |
return -1; |
| 280 |
} |
} |
| 281 |
|
|