/[LeafOK_CVS]/lbbs/src/str_process.c
ViewVC logotype

Contents of /lbbs/src/str_process.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (show annotations)
Sat May 17 05:54:42 2025 UTC (10 months ago) by sysadm
Branch: MAIN
Changes since 1.8: +4 -12 lines
Content type: text/x-csrc
Refine

1 /***************************************************************************
2 str_process.c - description
3 -------------------
4 Copyright : (C) 2004-2025 by Leaflet
5 Email : leaflet@leafok.com
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 3 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "str_process.h"
18 #include "common.h"
19 #include "log.h"
20 #include <stdio.h>
21 #include <string.h>
22
23 int split_line(const char *buffer, int max_display_len, int *p_eol, int *p_display_len)
24 {
25 int i;
26 *p_eol = 0;
27 *p_display_len = 0;
28
29 for (i = 0; buffer[i] != '\0'; i++)
30 {
31 char c = buffer[i];
32
33 if (c == '\r' || c == '\7') // skip
34 {
35 continue;
36 }
37
38 if (c == '\n')
39 {
40 i++;
41 *p_eol = 1;
42 break;
43 }
44
45 if (c == '\033' && buffer[i + 1] == '[') // Skip control sequence
46 {
47 i += 2;
48 while (buffer[i] != '\0' && buffer[i] != 'm')
49 {
50 i++;
51 }
52 continue;
53 }
54
55 if (c > 127 && c <= 255) // GBK chinese character
56 {
57 if (*p_display_len + 2 > max_display_len)
58 {
59 break;
60 }
61 i++;
62 *p_display_len += 2;
63 }
64 else
65 {
66 if (*p_display_len + 1 > max_display_len)
67 {
68 break;
69 }
70 (*p_display_len)++;
71 }
72 }
73
74 return i;
75 }
76
77 long split_data_lines(const char *p_buf, int max_display_len, long *p_line_offsets, long line_offsets_count)
78 {
79 int line_cnt = 0;
80 int len = 0;
81 int end_of_line = 0;
82 int display_len = 0;
83
84 p_line_offsets[line_cnt] = 0L;
85
86 while (1)
87 {
88 len = split_line(p_buf, max_display_len, &end_of_line, &display_len);
89
90 if (len == 0) // EOF
91 {
92 break;
93 }
94
95 // Exceed max_line_cnt
96 if (line_cnt + 1 >= line_offsets_count)
97 {
98 log_error("Line count %d reaches limit %d\n", line_cnt + 1, line_offsets_count);
99 return line_cnt;
100 }
101
102 p_line_offsets[line_cnt + 1] = p_line_offsets[line_cnt] + len;
103 line_cnt++;
104 p_buf += len;
105 }
106
107 return line_cnt;
108 }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1