8c2952457
김태훈
응용 프로그램 추가
|
1
2
3
|
/**
@file strparsing.c
@date 2009-06-01
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
4
|
@author 장길석 jwjwmx@gmail.com
|
8c2952457
김태훈
응용 프로그램 추가
|
5
|
@brief Ver 0.0.4
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
6
|
문자열을 분석하여 tstrlist로 생성한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
7
8
9
10
|
@todo
@bug
@remark
@warning
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
11
12
13
|
- 저작권 에프에이리눅스(주)
- 외부공개 금지
@section ModifyInfo 수정 정보
|
8c2952457
김태훈
응용 프로그램 추가
|
14
|
- 2009-07-06
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
15
|
-# Doxygen을 위한 주석 수정
|
8c2952457
김태훈
응용 프로그램 추가
|
16
|
- 2009-06-01
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
17
|
-# 기본 기능을 추가
|
8c2952457
김태훈
응용 프로그램 추가
|
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
*/
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <tlist.h>
#include <tstrlist.h>
#include <strparsing.h>
#define MAX_BUFFSIZE 1024
#define MAX_IDENTIFY 128
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
32
|
int strp_error_code; // 에러코드
|
8c2952457
김태훈
응용 프로그램 추가
|
33
34
35
36
37
|
static char buff_parse[1024];
static char buff_identify[1024];
static char *read_string( tstrlist *strplist, char *str_identify)
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
38
39
40
41
42
43
|
//설명: 구별자의 문자열 데이터를 구한다.
//인수: tstrlist *strplist : tstrlist 객체 포인터
// char *str_identify : 구별자 문자열
//반환: 섹션과 구별자의 문자열 데이터
//주의: 섹션과 구별자가 없다면 NULL을 반환
// 반환된 문자열 포인터로 메모리 소멸을 해서는 안 된다.
|
8c2952457
김태훈
응용 프로그램 추가
|
44
45
46
47
48
49
50
51
52
53
|
{
int index;
index = tstrlist_indexof( strplist, str_identify);
if ( 0 > index) return NULL;
return (char *)tstrlist_get_object( strplist, index);
}
static char *get_inner( char *str, char branch)
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
54
55
56
|
// 설명: " 또는 ' 으로 묶인 문자열 값을 구한다.
// 참고: 인용 부호 안에는 공백 문자 이상의 모든 문자를 포함한다.
// 반환: 인수로 받은 문자열 포인터에서 다음 처리할 문자 위치
|
8c2952457
김태훈
응용 프로그램 추가
|
57
|
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
58
59
|
char *pbuff; // 버퍼 사용을 위한 포인터
char ch_data; // 검색 대상 문자
|
8c2952457
김태훈
응용 프로그램 추가
|
60
61
62
63
64
65
|
pbuff = buff_parse;
while( '\0' != *str)
{
ch_data = *str++;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
66
|
if ( branch == ch_data) // 구별자 문자를 만났다면
|
8c2952457
김태훈
응용 프로그램 추가
|
67
68
69
70
71
|
{
break; // break
}
else
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
72
|
*pbuff++ = ch_data; // 문자열 복사
|
8c2952457
김태훈
응용 프로그램 추가
|
73
74
|
}
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
75
|
*pbuff = '\0'; // 데이터 구성 완료
|
8c2952457
김태훈
응용 프로그램 추가
|
76
77
78
79
|
return str;
}
static char *get_string( char *str)
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
80
81
|
// 설명: 문자열 끝이나 '=' 문자를 만나기 까지 공백없는 문자열을 구한다.
// 반환: 인수로 받은 문자열 포인터에서 다음 처리할 문자 위치
|
8c2952457
김태훈
응용 프로그램 추가
|
82
|
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
83
84
|
char *pbuff; // 버퍼 사용을 위한 포인터
char ch_data; // 검색 대상 문자
|
8c2952457
김태훈
응용 프로그램 추가
|
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
pbuff = buff_parse;
while( '\0' != *str)
{
ch_data = *str;
if ( ( ' ' == ch_data) || ( '=' == ch_data))
{
break;
}
else
{
*pbuff++ = ch_data;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
100
|
str++; // 이 함수 호출 후에 '='문자가 있는지를 확인해야 하므로, 여기서 포인터 증가
|
8c2952457
김태훈
응용 프로그램 추가
|
101
102
103
104
105
106
|
}
*pbuff = '\0';
return str;
}
static char *get_parse( char *str)
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
107
108
|
// 설명: 인수로 받은 문자열을 인용부호와 인용부호가 없는 문자열에 따라 파싱한다.
// 반환: 인수로 받은 문자열 포인터에서 다음 처리할 문자 위치
|
8c2952457
김태훈
응용 프로그램 추가
|
109
110
111
112
113
114
115
|
{
buff_parse[0] = '\0';
while( '\0' != *str)
{
switch( *str++)
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
116
|
case '\'' : // 인용부호 ' 문자 사이의 문자열을 구한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
117
118
119
120
|
{
str = get_inner( str, '\'');
return str;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
121
|
case '"' : // 인용부호 " 문자 사이의 문자열을 구한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
122
123
124
125
|
{
str = get_inner( str, '\"');
return str;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
126
127
|
case ' ' : // 공백이나
case '=' : // 분리자 이면 다음 문자를 계속 검색
|
8c2952457
김태훈
응용 프로그램 추가
|
128
129
130
|
break;
default :
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
131
|
str = get_string( str-1); // 공백이나 분리자를 만날 때까지의 문자열을 구한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
132
133
134
135
136
137
138
139
|
return str;
}
}
}
return str;
}
static int is_identify( char *str)
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
140
141
142
|
// 설명: 방금 구한 문자열이 구별자인지를 확인한다.
// 참고: 문자열 뒤에 공백이나 분리자만 있다면 구별자로 인정
// 반환: 구별자 여부
|
8c2952457
김태훈
응용 프로그램 추가
|
143
144
145
146
147
|
{
while( '\0' != *str)
{
switch( *str++)
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
148
149
150
|
case ' ' : break; // 공백 문자이면 다음 문자를 계속 검색
case '=' : return 1; // '=' 문자가 있으면 OK
default : return 0; // 공백이나 '=' 문자가 아니면 FALSE
|
8c2952457
김태훈
응용 프로그램 추가
|
151
152
153
154
155
156
|
}
}
return 0;
}
static void parse_string( tstrlist *lst_parse, char *str)
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
157
158
|
// 설명: 구별자와 구별자에 대한 데이터를 구한다.
// 반환: 구별자 개수
|
8c2952457
김태훈
응용 프로그램 추가
|
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
{
char *pdata;
while ( '\0' != *str)
{
str = get_parse( str);
if ( '\0' == buff_parse[0])
{
break;
}
if ( !is_identify( str))
{
continue;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
173
|
memcpy( buff_identify, buff_parse, strlen( buff_parse)+1); // NULL까지 포함하기 위해 +1
|
8c2952457
김태훈
응용 프로그램 추가
|
174
175
176
177
178
179
180
181
182
183
|
str = get_parse( str);
pdata = ( char *)malloc( strlen( buff_parse)+1);
if ( NULL == pdata)
{
strp_error_code = STRPERR_OUT_OF_MEMORY;
break;
}
else
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
184
|
memcpy( pdata, buff_parse, strlen( buff_parse)+1); // NULL까지 포함하기 위해 +1
|
8c2952457
김태훈
응용 프로그램 추가
|
185
186
187
188
189
190
191
|
tstrlist_add_object( lst_parse, buff_identify, pdata);
}
}
}
int strp_read_bool( tstrlist *strplist, char *str_identify, int default_value)
/**
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
192
193
194
195
196
197
198
199
200
201
202
|
@brief 구별자가 지정하는 Boolean 데이터를 구한다.
@param strplist : 파싱 자료를 가지고 있는 tstlist
@param str_identify : 구별자 문자열
@param default_value : 값이 없다면 대신 반환될 기본값
@warning 구별자의 문자열이 0 이면 FALSE로 반환하며
이외는 무조건 TRUE로 반환한다.
즉, 구별자가 가지고 있는 문자열 정보가
'0' 인지 아닌지의 여부를 반환한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
203
204
205
206
207
|
*/
{
char *data;
int int_data;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
208
209
210
211
212
|
data = read_string( strplist, str_identify); // 먼저 구별자로 데이터를 구한다.
if ( NULL == data) return default_value; // 찾는 데이터가 없다면 기본값을 반환한다.
else if ( 0 == strlen( data) ) return default_value; // 문자열 데이터가 없다면 기본값을 반환한다.
else if ( 0 == sscanf( data, "%d", &int_data)) return default_value; // 정수로 변환된 값이 없다면 기본값을 반환
else return 0 != int_data; // 정수 값이 0이면 FALSE로 반환한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
213
214
215
216
|
}
double strp_read_real( tstrlist *strplist, char *str_identify, double default_value)
/**
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
217
218
219
220
|
@brief 구별자가 지정하는 정수 데이터를 구한다.
@param strplist : 파싱 자료를 가지고 있는 tstlist
@param str_identify : 구별자 문자열
@param default_value : 값이 없다면 대신 반환될 기본값
|
8c2952457
김태훈
응용 프로그램 추가
|
221
|
@return
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
222
223
|
- 구별자에 해당하는 실수 값
- 저정한 섹션이나 구별자에 대한 실수 값이 없다면 기본값을 반환
|
8c2952457
김태훈
응용 프로그램 추가
|
224
225
226
227
228
229
|
*/
{
char *data;
double float_data;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
230
231
232
233
234
|
data = read_string( strplist, str_identify); // 먼저 구별자로 데이터를 구한다.
if ( NULL == data) return default_value; // 찾는 데이터가 없다면 기본값을 반환한다.
else if ( 0 == strlen( data) ) return default_value; // 문자열 데이터가 없다면 기본값을 반환한다.
else if ( 0 == sscanf( data, "%lf", &float_data)) return default_value; // 실수로 변환된 값이 없다면 기본값을 반환
else return float_data; // 실수 값을 반환한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
235
236
237
238
|
}
int strp_read_integer( tstrlist *strplist, char *str_identify, int default_value)
/**
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
239
240
241
242
|
@brief 구별자가 지정하는 정수 데이터를 구한다.
@param strplist : 파싱 자료를 가지고 있는 tstlist
@param str_identify : 구별자 문자열
@param default_value : 값이 없다면 대신 반환될 기본값
|
8c2952457
김태훈
응용 프로그램 추가
|
243
|
@return
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
244
245
|
- 구별자에 해당하는 정수 값
- 저정한 섹션이나 구별자에 대한 정수 값이 없다면 기본값을 반환
|
8c2952457
김태훈
응용 프로그램 추가
|
246
247
248
249
250
|
*/
{
char *data;
int int_data;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
251
252
253
254
255
|
data = read_string( strplist, str_identify); // 먼저 구별자로 데이터를 구한다.
if ( NULL == data) return default_value; // 찾아진 데이터가 없다면 기본값을 반환한다.
else if ( 0 == strlen( data) ) return default_value; // 문자열 데이터가 없다면 기본값을 반환한다.
else if ( 0 == sscanf( data, "%d", &int_data)) return default_value; // 정수로 변환된 값이 없다면 기본값을 반환
else return int_data; // 정수값을 반환한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
256
257
258
259
|
}
char *strp_read_string( tstrlist *strplist, char *str_identify, char *default_value)
/**
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
260
261
262
263
|
@brief 섹션과 구별자가 지정하는 문자열 데이터를 구한다.
@param strplist : 파싱 자료를 가지고 있는 tstlist
@param str_identify : 구별자 문자열
@param default_value : 값이 없다면 대신 반환될 기본값
|
8c2952457
김태훈
응용 프로그램 추가
|
264
265
|
@return
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
266
267
268
269
|
구별자의 문자열 정보
저정한 섹션이나 구별자에 대한 문자열이 없다면 기본값을 반환
@warning 절대 반환 받은 문자열을 소멸 시켜서는 안 된다!!
|
8c2952457
김태훈
응용 프로그램 추가
|
270
271
272
273
|
*/
{
char *data;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
274
275
276
|
data = read_string( strplist, str_identify); // 먼저 구별자로 데이터를 구한다.
if ( NULL == data) return default_value; // 찾아진 데이터가 없다면 기본값을 반환한다.
else if ( 0 == strlen( data) ) return default_value; // 문자열 데이터가 없다면 기본값을 반환한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
277
278
279
280
281
|
else return data;
}
char *strp_error_string( void)
/**
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
282
283
284
|
@brief strp_error_code에 대한 에러 설명 문자열을 반환
@return 에러 코드에 대한 에러 설명 문자열 포인터
@warning 절대 반환 받은 문자열을 소멸 시켜서는 안 된다!!
|
8c2952457
김태훈
응용 프로그램 추가
|
285
286
|
*/
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
287
288
289
290
291
292
293
294
295
|
char *error_string[] ={ "에러 없음", // INIERR_NONE
"메모리 부족", // INIERR_OUT_OF_MEMORY
"파일 이름 지정 오류", // INIERR_FILENAME_FAIL
"자료 없음", // INIERR_NO_DATA
"IniFile 없음", // INIERR_NO_FILE
"IniFile을 읽을 수 없음", // INIERR_ACCESS_FAIL
"섹션 리스트 생성 실패", // INIERR_CREATE_SECTION_FAIL
"구별자 생성 실패", // INIERR_CREATE_IDENTIFY_FAIL
"인수의 객체가 NULL" // INIERR_NULL_POINTER
|
8c2952457
김태훈
응용 프로그램 추가
|
296
297
298
299
300
301
|
};
return( error_string[strp_error_code]);
}
int strp_print_error( char *remark)
/**
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
302
303
|
@brief ini_error_code에 대한 에러 설명 문자열을 화면에 출력
@param remark : 에러 설명 문자열 끝에 첨부하여 출력할 문자열
|
8c2952457
김태훈
응용 프로그램 추가
|
304
305
|
@return
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
306
|
에러 코드
|
8c2952457
김태훈
응용 프로그램 추가
|
307
308
309
310
311
312
313
314
315
|
*/
{
printf( "[str parsing error:%d]%s %s
", strp_error_code, strp_error_string(), remark);
return strp_error_code;
}
void strp_free( tstrlist *strplist)
/**
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
316
317
|
@brief strparsing 객체를 소멸한다.
@param strplist : strparsing 객체
|
8c2952457
김태훈
응용 프로그램 추가
|
318
319
320
321
322
323
324
|
*/
{
int ndx;
char *pdata;
for ( ndx = 0; ndx < tstrlist_getcount( strplist); ndx++)
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
325
|
pdata = ( char *)tstrlist_get_object( strplist, ndx); // 객체로 등록한 문자열 제거
|
8c2952457
김태훈
응용 프로그램 추가
|
326
327
|
free( pdata);
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
328
|
tstrlist_free( strplist); // 리스트 소멸
|
8c2952457
김태훈
응용 프로그램 추가
|
329
330
331
|
}
tstrlist *strp_parsing( char *data)
/**
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
332
333
334
|
@brief data 문자열을 분석해서 구별자와 데이터로 구성된 아이템 목록을 만든다.
@param data : 문자열 데이터
|
8c2952457
김태훈
응용 프로그램 추가
|
335
336
|
@return
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
337
338
339
|
구별자와 데이터로 구성된 아이템의 tstrlist *
읽기에 실패했다면 NULL을 반환
|
8c2952457
김태훈
응용 프로그램 추가
|
340
341
342
343
|
*/
{
tstrlist *lst_parse;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
344
|
strp_error_code = STRPERR_NONE; // 에러코드: 에러 없음
|
8c2952457
김태훈
응용 프로그램 추가
|
345
|
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
346
347
|
lst_parse = tstrlist_create(); // tstrlist 객체 생성
if ( NULL == lst_parse) // tstrlist 객체를 생성하지 못했다면
|
8c2952457
김태훈
응용 프로그램 추가
|
348
|
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
349
|
strp_error_code = STRPERR_CREATE_LIST_FAIL; // 에러코드: 루트 섹션 리스트 생성
|
8c2952457
김태훈
응용 프로그램 추가
|
350
351
352
353
354
|
return NULL;
}
parse_string( lst_parse, data);
return lst_parse;
}
|