-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsystem.c
More file actions
145 lines (91 loc) · 2.13 KB
/
system.c
File metadata and controls
145 lines (91 loc) · 2.13 KB
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
/*
[xbat] /system.c , 150206 (C) 2005-2015 MF
*/
#include "xbat.h"
/* 用于保存环境变量的缓冲区大小 */
#define ENV_BUFFER_SIZE 32768
/* 由格式化串创建字符串, 调用者释放内存 */
static char * xBuildFormatString (const char *format, va_list argument)
{
char * message;
int length = vsnprintf (NULL, 0, format, argument);
if((message = (char *) calloc (length + 1, sizeof (char))) == NULL)
return NULL;
vsprintf (message, format, argument);
return message;
}
static char * xEnvRead (const char *name)
{
char * buffer = (char *) calloc (ENV_BUFFER_SIZE, sizeof (char));
if(buffer == NULL)
return NULL;
if(GetEnvironmentVariableA (name, buffer, ENV_BUFFER_SIZE) == 0)
{
free (buffer);
return (char *) calloc (1, sizeof (wchar_t));
}
return buffer;
}
char * xEnvReadString (const char *name)
{
return xEnvRead (name);
}
int xEnvReadInt (const char *name)
{
char * text = xEnvRead (name);
int value = 0;
if(text == NULL)
return 0;
value = (int) strtol (text, NULL, 0);
free (text);
return value;
}
unsigned int xEnvReadUint (const char *name)
{
char * text = xEnvRead (name);
unsigned int value = 0;
if(text == NULL)
return 0;
value = (unsigned int) strtoul (text, NULL, 0);
free (text);
return value;
}
int xEnvWrite (const char *name, const char *format, ...)
{
int result;
char * message;
va_list argument;
va_start (argument, format);
if((message = xBuildFormatString (format, argument)) == NULL)
result = 0;
else
{
if(SetEnvironmentVariableA (name, message) == FALSE)
result = 0;
else
result = 1;
free (message);
}
va_end (argument);
return result;
}
void xError (const char *format, ...)
{
va_list argument;
/* 错误消息 */
char * message;
/* 错误模式 */
int mode = xEnvReadInt (X_CONFIG_ERROR_MODE);
va_start (argument, format);
if((message = xBuildFormatString (format, argument)) == NULL)
message = "应用程序遇到未知错误。";
va_end (argument);
switch(mode)
{
/* 命令提示符 */
case 0: fprintf (stderr, "%s\n", message); break;
/* 窗体 */
case 1: MessageBoxA (NULL, message, "", MB_ICONERROR | MB_OK); break;
}
exit (-1);
}