-
Notifications
You must be signed in to change notification settings - Fork 0
/
log_errno_write.c
153 lines (136 loc) · 3.41 KB
/
log_errno_write.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <stdarg.h>
using namespace std;
#define BUFFER_PIECE_SIZE 64
#define CONST_STR_LEN(x) x, x ? sizeof(x) - 1 : 0
typedef struct
{
char *ptr;
size_t size;
size_t used;
}buffer;
buffer* buffer_init(void) {
buffer *b;
b = (buffer *)malloc(sizeof(*b));
//assert(b);
b->ptr = NULL;
b->size = 0;
b->used = 0;
return b;
}
//确保用户指定的buffer结构体b的ptr的指向区域至少有size大小的 空闲 内存空间
int buffer_prepare_append(buffer *b, size_t size) {
if (!b) return -1;
if (0 == b->size) {
b->size = size;
b->size += BUFFER_PIECE_SIZE - (b->size % BUFFER_PIECE_SIZE);
b->ptr = (char *)malloc(b->size);
b->used = 0;
//assert(b->ptr);
} else if (b->used + size > b->size) {
b->size += size;
b->size += BUFFER_PIECE_SIZE - (b->size % BUFFER_PIECE_SIZE);
b->ptr =(char *) realloc(b->ptr, b->size);
//assert(b->ptr);
}
return 0;
}
int LI_ltostr(char *buf, long val) {
char swap;
char *end;
int len = 1;
if (val < 0) {
len++;
*(buf++) = '-';
//将负数转为正数
val = -val;
}
//使end指针和buf指针所指的位置一致
end = buf;
while (val > 9) {
*(end++) = '0' + (val % 10);
val = val / 10;
}
*(end) = '0' + val;
*(end + 1) = '\0'; //这里并没有改变end的值
len += end - buf; //len=len+end-buf;当指针名没有*符号时,所指的是指针位置
while (buf < end) { //调换,因为内存先显示低位
swap = *end;
*end = *buf;
*buf = swap;
buf++;
end--;
}
return len;
}
//将有符号长整型数value转换成对应的十进制字符串,并将其复制到buffer结构体的数据末尾
int buffer_append_long(buffer *b, long val) {
if (!b) return -1;
buffer_prepare_append(b, 32);
if (b->used == 0)
b->used++;
b->used += LI_ltostr(b->ptr + (b->used - 1), val);
return 0;
}
//把指定字符串s复制到用户指定的buffer结构体b的数据空间末尾
int buffer_append_string(buffer *b, const char *s) {
size_t s_len;
if (!s || !b) return -1;
s_len = strlen(s);
buffer_prepare_append(b, s_len + 1);
if (b->used == 0)
b->used++;
memcpy(b->ptr + b->used - 1, s, s_len + 1);
b->used += s_len;
return 0;
}
//把指定字符串s前s_len个字符复制到用户指定的buffer结构体b的数据空间末尾
int buffer_append_string_len(buffer *b, const char *s, size_t s_len) {
if (!s || !b) return -1;
if (s_len == 0) return 0;
buffer_prepare_append(b, s_len + 1);
if (b->used == 0)
b->used++;
memcpy(b->ptr + b->used - 1, s, s_len);
b->used += s_len;
b->ptr[b->used - 1] = '\0';
return 0;
}
int log_error_write(buffer *log,const char *filename, unsigned int line, const char *fmt, ...) {
va_list ap;
char *c;
buffer_append_string(log, filename);
buffer_append_string_len(log, CONST_STR_LEN("."));
buffer_append_long(log, line);
buffer_append_string_len(log, CONST_STR_LEN("\n"));
for(va_start(ap, fmt); *fmt; fmt++) {
int d;
char *s;
buffer *b;
off_t o;
switch(*fmt) {
case 's': /* string */
s = va_arg(ap, char *);
buffer_append_string(log, s);
buffer_append_string_len(log, CONST_STR_LEN(" "));
break;
case 'i':
d = va_arg(ap, int);
buffer_append_long(log, d);
buffer_append_string_len(log, CONST_STR_LEN(" "));
break;
}
}
va_end(ap);
printf("%s\n",log->ptr);
return 0;
}
int main()
{
buffer *log;
log=buffer_init();
log_error_write(log,__FILE__,__LINE__,"sii","helloworld",112,555);
}